2011-11-21 7 views

risposta

26

ManualResetEvent e ManualResetEventSlim entrambi sono progettati in modo che rimanessero segnalati dopo la chiamata. Questo è in genere per uno scenario molto diverso da AutoResetEvent.

AutoResetEvent torna immediatamente allo stato non indicato dopo l'utilizzo, che viene in genere utilizzato per un diverso insieme di scenari. Dalla documentazione AutoResetEvents:

In genere, si utilizza questa classe quando i thread richiedono l'accesso esclusivo a una risorsa.

ManualResetEvent (e Slim) sono tipicamente utilizzati, invece, per uno scenario in cui:

questa comunicazione riguarda un compito che un thread deve essere completato prima altri thread può procedere.

Dal AutoResetEvent è più comunemente usato in scenari in cui ci sono più thread che condividono una risorsa, i tempi di attesa in genere non sarebbe estremamente breve. ManualResetEventSlim, tuttavia, è davvero inteso solo quando si sa, in anticipo, il tempo di attesa è molto breve. Se il tuo tempo di attesa non sarà molto breve, dovresti usare invece ManualResetEvent. Vedere la documentazione su difference between MRE and MRES per i dettagli.

Quando i tempi di attesa sono più lunghi (che sarebbe lo scenario normale con AutoResetEvent), la versione "slim" è in realtà peggiore, poiché ripristina l'utilizzo di un handle di attesa.

10

ero spiati da questo fatto pure. Tuttavia risulta che è possibile simulare un AutoResteEvent (Slim) utilizzando un semplice SemaphoreSlim con una configurazione speciale:

SemaphoreSlim Lock = new SemaphoreSlim(1, 1); 

Il primo parametro (http://msdn.microsoft.com/en-us/library/dd270891(v=vs.110).aspx) definisce lo stato iniziale del semaforo: 1 significa che un thread può entrare , 0 che il semaforo deve essere rilasciato per primo. Così a = new AutoResetEvent(true) traduce in = new SemaphoreSlim(1, 1) e a = new AutoResetEvent(false) traduce in = new SemaphoreSlim(0, 1) rispettivamente.

Il secondo parametro definisce il numero massimo di thread che possono entrare il semaforo simultaneamente. Impostandolo su 1 si comporta come un AutoResetEvent.

Un'altra cosa interessante di SemaphoreSlim è che con il nuovo modello asincrono/attesa in 4.5 la classe ha ricevuto un metodo .WaitAsync() che può essere atteso. Quindi non è più necessario creare manualmente una primitiva di attesa attendibile in questo caso.

Spero che questo aiuti.