Comment puis-je débloquer les discussions qui ont appelé la méthode WaitOne sur un AutoResetEvent objet?

Ci-dessous est une classe ayant la méthode 'SomeMethod" qui illustre mon problème.

class SomeClass
{
    AutoResetEvent theEvent = new AutoResetEvent(false);
    //more member declarations

    public void SomeMethod()
    {
        //some code
        theEvent.WaitOne();
        //more code
    }
}

La méthode est conçue pour être thread-safe et sera appelé dans des threads différents. Maintenant, ma question est comment est-il possible de débloquer toutes les discussions qui ont appelé le "WaitOne de la méthode sur le theEvent' objet à n'importe quel moment? Cette exigence se pose fréquemment dans ma conception parce que j'ai besoin pour être en mesure d'arrêter et de démarrer mon programme multi-threadé. Il me semble qu'il est assez simple de commencer un programme multi-threadé, mais difficile à arrêter.

Voici ce que j'ai essayé jusqu'à présent qui fonctionne apparemment. Mais est-ce l'approche standard?

public void UnblockAll()
{
    do
    {
        theEvent.Set();
    } while (theEvent.WaitOne(0));
}

Le "UnblockAll méthode est un membre de la "SomeClass" classe. La technique utilisée ici est basée sur la documentation MSDN de la Méthode WaitOne. Je cite la partie pertinente de la documentation ci-dessous:

Si millisecondsTimeout est égale à zéro, la méthode ne prend pas en bloc. Il teste l'état de la le d'attente de la poignée et retourne immédiatement.

Dans la boucle do..while, j'appelle le La méthode de jeu. Cela libère un seul thread qui a peut-être bloqué en raison d'un appel à la méthode WaitOne (codé à l'intérieur de la 'SomeMethod de la méthode). Ensuite, j'ai tester l'état de la "theEvent' objet juste pour savoir si c'est signalée. Ce test se fait en appelant la version surchargée de la méthode WaitOne qui prend le temps de paramètre. L'argument que j'utilise lorsque j'appelle la méthode WaitOne est égal à zéro, conformément à la documentation des résultats de l'appel de retourner immédiatement avec une valeur booléenne. Si la valeur de retour est true, alors le 'theEvent' objet était dans un signalé état. Si il y a au moins un seul thread bloqué sur l'appel à la "WaitOne" méthode "dans le" SomeMethod "méthode", l'appel à l'Ensemble de la méthode (codé à l'intérieur de la 'UnblockAll " méthode") serait le débloquer. Par conséquent, l'appel à la "WaitOne' méthode à la fin de l'instruction do..while dans le "UnblockAll' méthode retourne false. La valeur de retour n'est vrai que si il n'y avait pas de threads bloqués.

Est le raisonnement ci-dessus à droite et si c'est bon, c'est la technique standard de façon à faire face à mon problème? Je suis en train d'utiliser la solution principalement sur l' .net compact framework 2.0 de la plateforme.

Hors sujet - on ne peut pas appeler variable '"événement"
On dirait que vous voulez un ManualResetEvent à la place. De cette façon il va rester ensemble, même si vous disposez de plusieurs auditeurs.
corrigé les erreurs de syntaxe dans le code..

OriginalL'auteur ghd | 2011-05-09