2010-07-22 28 views
32

Ho un WaitHandle e vorrei sapere come verificare se WaitHandle è già stato impostato o meno.Come verificare se WaitHandle è stato impostato?

Nota: È possibile aggiungere una variabile bool e ogni volta che si utilizza il metodo Set(), impostare la variabile su true, ma questo comportamento deve essere creato in WaitHandle da qualche parte.

Grazie per l'aiuto!

+0

La mia risposta è stata solo pochi secondi prima SwDevMan di che è molto più chiara e comprende la documentazione preventivo, quindi lo sto eliminando. Tuttavia, mi chiedo ancora "Ti stai occupando di un evento di reset automatico che potrebbe essere già stato ripristinato o che il codice di test non deve essere resettato?" –

risposta

47

Prova WaitHandle.WaitOne(0)

Se millisecondsTimeout è pari a zero, il metodo non bloccare. Verifica lo stato dell'impugnatura di attesa e restituisce immediatamente.

+1

* Vergogna * Grazie! –

+0

+1 Buona risposta chiara. Bello e semplice, anche se suggerirei di cambiare "Prova" con "Usa". Così com'è, sembri insicuro della tua risposta. –

+3

L'unico problema è che per alcuni WaitHandles (evento di reset automatico, semaforo), lo stato di pronto verrà effettivamente resettato attendendolo. –

2

Utilizzare uno dei metodi su Wait...WaitHandle che prende un valore di timeout, come WaitOne, e passare un timeout di 0.

1

È possibile utilizzare il metodo WaitOne(int millisecondsTimeout, bool exitContext) e passare 0 per il periodo. Ritornerà subito.

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

Perché dovrebbero usare quella che accetta un valore 'exitContext'? Considerando che ci sono alternative che non richiedono questo campo, dovresti spiegare la sua necessità. –

+0

La guida in linea per VS2005 mostra solo WaitOne(), WaitOne (int, bool) e WaitOne (TimeSpan, bool). Quindi, è probabile che non abbiano trovato 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)); 

uscita:

è impostato: False

è impostato: Vero

+0

Perché utilizzare una parola chiave per la variabile? Non è necessario e rende la risposta più difficile da leggere. –

+0

@Jeff Certo, è solo una cosa difficile da nominare per qualche codice di esempio, e ho scritto molto codice oggi. –

+0

@chibacity: è facile scrivere qualcosa di diverso dall'evento. 'waitHandle',' resetEvent', 'mre',' myEvent'. La lista è infinita e renderebbe il tuo esempio migliore. –

Problemi correlati