2010-07-22 5 views
32

J'ai un WaitHandle et je voudrais savoir comment vérifier si le WaitHandle a déjà été réglé ou pas.Comment vérifier si le WaitHandle a été défini?

Remarque: Je peux ajouter une variable bool et lorsque la méthode Set() est définie, définissez la variable sur true, mais ce comportement doit être généré dans WaitHandle quelque part.

Merci pour votre aide!

+0

Ma réponse était que quelques secondes avant de SwDevMan qui est beaucoup plus claire et inclut la documentation citation, donc je le supprime. Cependant, je me demande toujours "Avez-vous affaire à un événement de réinitialisation automatique qui a peut-être déjà été réinitialisé, ou que le code de test ne doit pas être réinitialisé?" –

Répondre

47

Essayez WaitHandle.WaitOne(0)

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

+1

* Honte * Merci! –

+0

+1 Bonne réponse claire. Agréable et simple, bien que je suggère de changer "Essayer" pour "Utiliser". En l'état, vous semblez incertain de votre réponse. –

+3

Le seul problème est que pour certains WaitHandles (événement de réinitialisation automatique, sémaphore), l'état prêt sera réinitialisé en l'attendant. –

2

Utilisez l'une des méthodes Wait...WaitHandle sur qui prend une valeur de délai d'attente, comme WaitOne, et passer un délai d'attente de 0.

1

Vous pouvez utiliser la méthode WaitOne(int millisecondsTimeout, bool exitContext) et passer à 0 pour le laps de temps. Il reviendra tout de suite.

bool isSet = yourWaitHandle.WaitOne(0, true); 
+0

Pourquoi devraient-ils utiliser celui qui prend une valeur 'exitContext'? Considérant qu'il existe des alternatives qui ne nécessitent pas ce champ, vous devez expliquer sa nécessité. –

+0

L'aide en ligne pour VS2005 affiche uniquement WaitOne(), WaitOne (int, bool) et WaitOne (TimeSpan, bool). Donc, il est probable qu'ils n'ont pas trouvé WaitOne (int) –

5
const int DoNotWait = 0; 

ManualResetEvent waitHandle = new ManualResetEvent(false);     

Console.WriteLine("Is set:{0}", waitHandle.WaitOne(DoNotWait)); 

waitHandle.Set(); 

Console.WriteLine("Is set:{0}", waitHandle.WaitOne(DoNotWait)); 

Sortie:

est défini: Faux

est-il réglé: True

+0

Pourquoi utiliser un mot-clé pour la variable? C'est inutile et rend votre réponse plus difficile à lire. –

+0

@Jeff Bien sûr, c'est juste une chose difficile à nommer pour un exemple de code, et j'ai écrit beaucoup de code aujourd'hui. –

+0

@chibacity: il est facile d'écrire autre chose qu'un événement. 'waitHandle',' resetEvent', 'mre',' myEvent'. La liste est infinie et cela rendrait votre exemple meilleur. –

Questions connexes