2009-09-22 5 views
1

Je cherche une méthode où je peux m'assurer qu'aucun callback n'attend d'être exécuté sur un thread System.Timers.Timer après que j'aie appelé Stop() dessus.C# Timer/Event Race - Vider le thread de minuteurs

Fondamentalement, j'ai une minuterie et une prise asynchrone - Soit on peut invoquer une fonction appropriée lorsque le temps s'écoule ou qu'un nouveau paquet est reçu. Naturellement, je ne veux pas que ce soit possible pour les deux choses à la fois.

Au moment où je protégerai les entrailles de chaque fonction via l'aide d'un mutex:

if (!_mutex.WaitOne(0, true)) 
{ 
    return; 
} 
_TimeOut.Stop(); 
... // function body goes here 
_mutex.ReleaseMutex(); 

Dans la minuterie il y a un certain nombre d'opérations qui ont lieu entre le temps écoulé et l'événement Licenciement, donnant ainsi la possibilité que, même après l'arrêt de la minuterie, le rappel sera exécuté une fois que le mutex a été libéré. Ce qui signifie que le code ci-dessus ne fait pratiquement rien.

Alors, est-il possible de déterminer sur quel thread les internes de la minuterie fonctionnent? et soit en le forçant à sortir de la fonction de rappel, soit en bloquant jusqu'à ce que cette fonction soit terminée et en laissant le code aboce s'occuper des choses?

Merci.

Répondre

0

Dans votre gestionnaire de rappel ou d'événement, vous devez toujours vérifier si le temporisateur est réellement activé avant de faire quoi que ce soit d'autre.

+0

Malheureusement, mon rappel de socket redémarre la minuterie, ce qui signifie qu'elle sera activée dans ce cas. –