Question

Je veux arrêter un System.Timers.Timer qui s'exécute dans un hub SignalR après qu'un client ferme une fenêtre/un onglet contenant la connexion active.

J'ai essayé d'envoyer une valeur booléenne au serveur en appelant le code du serveur pour informer le serveur que le client est toujours connecté ou non, mais cela ne fonctionne pas actuellement.

window.onbeforeunload = function () {
    profile.server.setIsConnected(false);
};

Du côté serveur:

public ProfileHub()
{  
    timer = new Timer(15000);
    timer.Elapsed += (sender, e) => { timer_Elapsed(sender, e, _isActive); };
    timer.AutoReset = false;
}

[Authorize]
private void timer_Elapsed(object sender, ElapsedEventArgs e, bool active)
{            
    timer.Stop();

    if (active)
    {
        System.Diagnostics.Debug.WriteLine("Timer Started");
        timer.Start();
    }
    else
    {
        System.Diagnostics.Debug.WriteLine("Timer Stopped");
        return;
    }
    // process code
}

[Authorize]
public void SetIsActive(bool isActive)
{
    _isActive = isActive;
}

Est-ce possible et suis-je sur la bonne voie ?Je soupçonne que cela a quelque chose à voir avec le délégué anonyme de timer.Elapsed, mais je n'en suis pas entièrement sûr.

Était-ce utile?

La solution

SignalR a OnConnected, OnDisconnected et OnReconnected qui sont appelés chaque fois que le client effectue l'une de ces actions.Vous pouvez simplement les remplacer :

public override Task OnConnected()
{
    return base.OnConnected();
}

public override Task OnDisconnected()
{
    //custom logic here
    return base.OnDisconnected();
}

public override Task OnReconnected()
{
    return base.OnReconnected();
}

Je les ai trouvés extrêmement utiles également à des fins de débogage.Si vous souhaitez définir une minuterie pour chaque personne, vous devez utiliser une sorte de connectionMapping avec les fonctions ci-dessus pour suivre vos utilisateurs.

Autres conseils

Vous devriez utiliser la méthode OnDisconnected au lieu de la minuterie. Voici la documentation officielle, mais le framework vous donne des événements lorsqu'un client connecté se déconnecte ou se reconnecte.

Licencié sous: CC-BY-SA avec attribution
Non affilié à StackOverflow
scroll top