2010-03-08 15 views
6

Estoy planeando usar el Auto Reset Event Handle para la comunicación Inter Thread..NET Thread Synchronization

EventWaitHandle handle = new EventWaitHandle(false, EventResetMode.AutoReset); 

Mi productor código hilo mirada, como a continuación

produceSomething(); 
handle.Set(); 

En el hilo consumidor, tengo que descargar los datos por cada minuto o cuando el productor se llama al método Set

try 
{ 
    while(true) 
    { 
     handle.WaitOne(60000, false); 
     doSomething(); // Downloads data from Internet. 
         // Takes lot of time to complete it. 
    } 
} 
catch(ThreadAbortException) 
{ 
    cleanup(); 
} 

Mi pregunta es si el hilo del consumidor está ejecutando la función doSomething y las llamadas del productor establecen la función, ¿cuál sería el estado del objeto de evento de restablecimiento automático?

Mi requisito es que tan pronto como las llamadas del productor establezcan el método, tenga que descargar datos nuevos de Internet. Si se está ejecutando la función doSomething, cuando Producer llame al método set, tengo que interrumpirlo y volver a llamar.

Respuesta

2

Un evento de restablecimiento automático es como una puerta que se cierra después de que pasa el primer hilo. Si lo configura mientras uno o más subprocesos están esperando, entonces, un subproceso se activa, el evento se restablece y el resto de los subprocesos continúa esperando.

Si se establece cuando no hay hilos están esperando, entonces el primer subproceso que llama handle.WaitOne no va a esperar, sino que hará que el evento para reconfiguradas y luego seguir adelante.

de http://msdn.microsoft.com/en-us/library/system.threading.autoresetevent.aspx

Calling Conjunto AutoResetEvent señales para liberar un hilo de espera. AutoResetEvent permanece señalizado hasta que se libera un único hilo de espera y luego vuelve automáticamente al estado no señalado. Si no hay hilos esperando, el estado permanece señalizado indefinidamente.

Si un hilo llama a WaitOne mientras AutoResetEvent está en el estado señalado, el hilo no se bloquea. AutoResetEvent libera el subproceso inmediatamente y vuelve al estado no señalado.

1

El problema con el evento de restablecimiento automático en su escenario es que "ajuste" no lo soportes cola.

Es decir, establecer un evento de reinicio automático permite que un subproceso entre, si lo establece de nuevo antes de que un hilo "consuma" su evento, entonces ese "conjunto" se perderá. Puede esperar que dos hilos entren y consuman lo que haya producido pero, de hecho, solo UN hilo podrá hacerlo.

En su caso, si está produciendo a un ritmo más rápido de lo que está consumiendo, entonces el evento de reinicio automático podría ser engañoso. Imagina este caso.

  • El productor produce un artículo.
  • El consumidor consume el elemento (restablece el evento y comienza la descarga desde el inet)
  • El productor produce un segundo artículo.
  • El productor produce un tercer artículo.
  • El producto se detiene.
  • El consumidor consume el segundo elemento (resiente el evento y comienza a descargarlo de nuevo)
  • El consumidor NO consumirá el tercer artículo porque el evento de autoreset se ha restablecido.