Perché non c'è una classe AutoResetEventSlim
in BCL?Perché non AutoResetEventSlim in BCL?
Può essere simulato utilizzando ManualResetEventSlim
?
Perché non c'è una classe AutoResetEventSlim
in BCL?Perché non AutoResetEventSlim in BCL?
Può essere simulato utilizzando ManualResetEventSlim
?
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.
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.
'AutoResetEventSlim' possono essere simulati utilizzando' SemaphoreSlim'. – svick