c# .net multithreading c#-4.0 bcl

c# - ¿Por qué no AutoResetEventSlim en BCL?



.net multithreading (2)

Me molestó este hecho también. Sin embargo, parece que puede simular un AutoResteEvent (Slim) usando un SemaphoreSlim simple con una configuración especial:

SemaphoreSlim Lock = new SemaphoreSlim( 1, 1 );

El primer parámetro ( http://msdn.microsoft.com/en-us/library/dd270891(v=vs.110).aspx ) define el estado inicial del semáforo: 1 significa que puede entrar un hilo, 0 que el semáforo tiene que ser lanzado primero. Entonces a = new AutoResetEvent( true ) traduce a = new SemaphoreSlim( 1, 1 ) y a = new AutoResetEvent( false ) traduce a = new SemaphoreSlim( 0, 1 ) respectivamente.

El segundo parámetro define la cantidad máxima de hilos que pueden ingresar al semáforo al mismo tiempo. Establecerlo en 1 le permite comportarse como un AutoResetEvent .

Otra cosa agradable sobre el SemaphoreSlim es que con el nuevo patrón async / await en 4.5 la clase ha recibido un método .WaitAsync() que se puede esperar. Por lo tanto, ya no es necesario crear manualmente una primitiva espera aguardada en este caso.

Espero que esto ayude.

¿Por qué no hay una clase AutoResetEventSlim en BCL?

¿Se puede simular usando ManualResetEventSlim ?


ManualResetEvent y ManualResetEventSlim ambos están diseñados para que ManualResetEventSlim señalizados después de la llamada. Esto es típicamente para un escenario muy diferente a AutoResetEvent .

AutoResetEvent vuelve inmediatamente al estado desmarcado después del uso, que se usa generalmente para un conjunto diferente de escenarios. De la documentación de AutoResetEvents:

Normalmente, utiliza esta clase cuando los hilos necesitan acceso exclusivo a un recurso.

ManualResetEvent (y Slim ) se utilizan normalmente, sin embargo, para un escenario donde:

esta comunicación se refiere a una tarea que un hilo debe completar antes de que puedan continuar otros hilos.

Como AutoResetEvent se usa con mayor frecuencia en escenarios donde hay múltiples hilos que comparten un recurso, los tiempos de espera normalmente no serían extremadamente cortos. ManualResetEventSlim embargo, ManualResetEventSlim solo está destinado cuando sabes, de antemano, que el tiempo de espera es muy corto. Si su tiempo de espera no va a ser muy corto, entonces debería usar ManualResetEvent en ManualResetEvent lugar. Consulte la documentación sobre la diferencia entre MRE y MRES para más detalles.

Cuando los tiempos de espera son más largos (lo que sería el escenario normal con AutoResetEvent ), la versión "delgada" es realmente peor, ya que vuelve a utilizar un identificador de espera.