Domanda

In C#, quando si dovrebbe usare WaitHandle invece di lock?

È stato utile?

Soluzione

Un blocco è fondamentalmente differente da un WaitHandle. Con un blocco che si scrive, per esempio:

lock (SomeResource)
{
    // do stuff here
}

La prima riga dice: "Voglio l'accesso esclusivo a quella risorsa," e attenderà fino a quel risorsa è disponibile (vale a dire nessun altro ha un blocco su di esso). Poi le piste di codice e alla fine il blocco viene rilasciato in modo che altri possano utilizzarlo.

WaitHandle viene utilizzata per attendere un certo evento abbia luogo. Quando si scrive:

MyWaitHandle.WaitOne();

Il codice è in attesa di un altro filo (possibilmente in un altro processo) per segnalare che WaitHandle. Quello che i segnali potrebbe essere qualsiasi cosa. Forse siete in attesa di un altro thread per finire il suo lavoro e dire: "ho finito adesso", prima che il codice può continuare.

Quindi, per rispondere alla tua domanda, è necessario utilizzare un blocco quando si desidera ottenere accesso esclusivo a una risorsa. Si dovrebbe usare WaitHandle quando si desidera ricevere una notifica di qualche evento.

Altri suggerimenti

Un WaitHandle può attendere per più maniglie, un blocco può attendere per una sola.

Quando ne avete bisogno. Scherzi a parte, blocco è zucchero sintattico con Monitor, che probabilmente utilizza WaitHandles internamente.

Utilizzare solo se avete bisogno di una maggiore flessibilità (come per esempio di partecipazione a un blocco più lungo del campo di applicazione corrente ...) o il gestore di serrature multiple nel giusto ordine, ecc.

compiono cose completamente diverse. Un lock viene usato per limitare l'accesso ad un determinato blocco di codice per un solo thread alla volta. Una WaitHandle è la classe base per varie classi di concorrenza legati, come Semaphore, Mutex, AutoResetEvent, e ManualResetEvent, che consentono di controllo della concorrenza in modi leggermente diversi. Ad esempio, un Semaphore consente di limitare la concorrenza a non più di N fili, invece di un unico filo.

WaitHandle viene spesso usato quando si dispone di più thread in esecuzione e si desidera attendere per uno o tutti loro per completare prima di continuare a fare qualche altra azione. lock sarebbe utilizzato se si vuole evitare che più thread di accedere a una risorsa condivisa allo stesso tempo.

Le migliori bugie spiegazione a questi due link. Purtroppo si sta andando ad avere per fare qualche lettura per ottenere una risposta completa al tipo di domanda che hai posto:

Questa contiene un esempio così: http://msdn.microsoft.com/en-us/library /system.threading.waithandle.aspx

http://msdn.microsoft.com/en-us/library/ kad9xah9.aspx

Autorizzato sotto: CC-BY-SA insieme a attribuzione
Non affiliato a StackOverflow
scroll top