2011-05-03 8 views
12

¿Podría alguien introducir un caso de uso para el método AutoResetEvent.Reset()? ¿Cuándo y por qué me gustaría utilizar este método? Entiendo WaitOne and Set, pero esto no está claro para mí.AutoResetEvent Restablecer método

+4

¿Por qué votar a cerrar? Esta pregunta me parece perfectamente clara y útil ... –

Respuesta

6

Sí, el AutoResetEvent restablecerá automáticamente su estado cada vez que se señale un hilo que está esperando el evento. Sin embargo, es posible que un evento dado ya no sea válido y ningún hilo haya esperado en un AutoResetEvent desde que se configuró originalmente. En ese escenario el método Reset vuelve útil

+0

Pero, ¿cuál es el beneficio de llamar a Reset() en tal caso? – anth

+0

@ an evita que cualquier subproceso que aún no ha llamado a esperar, pero que en algún momento en el futuro, se active para un evento que ya no sea válido. Nota: Esto en sí mismo no es suficiente para evitar una condición de carrera, pero puede ser parte de una solución más grande – JaredPar

1

Parece que se acaba de heredar de EventWaitHandle. ¿Probablemente más útil con el ManualResetEvent que también hereda de esa clase?

0

Debe usar ManualResetEvent al usar Restablecer(), ya que AutoResetEvent se reinicia cuando se marca un hilo.

1

El método se hereda de la clase base EventWaitHandle y se utiliza para (re) establecer un AutoResetEvent en su estado "bloqueado".

Dado que AutoResetEvent entrará automáticamente en ese estado tan pronto como se indique, normalmente nunca verá este método utilizado en el código, pero para otras clases derivadas de EventWaitHandle sería mucho más útil.

1

Si el productor de AutoResetEvent desea borrar el evento, usaría Restablecer(). De esta forma, puede "reiniciar" el evento sin tener que saber si está señalizado. Si el productor usó WaitOne para "restablecer" su propio evento, existe el riesgo de que se bloquee (es decir, nunca regrese, ya que el evento no se señaliza y el hilo productor está bloqueado).

0

Restablecer:

establece el estado del evento que no señalizado , Ver EventWaitHandle Class

la muestra,

using System; 
using System.Threading; 
namespace ThreadingInCSharp.Signaling 
{ 
    class Program 
    { 
     static EventWaitHandle _waitHandle = new AutoResetEvent(false); 
     static void Main(string[] args) 
     { 
      //The event's state is Signal 
      _waitHandle.Set(); 
      new Thread(Waiter).Start(); 
      Thread.Sleep(2000); 
      _waitHandle.Set(); 
      Console.ReadKey(); 
     } 
     private static void Waiter() 
     { 
      Console.WriteLine("I'm Waiting..."); 
      _waitHandle.WaitOne(); 
      //The word pass will print immediately 
      Console.WriteLine("pass"); 
     } 
    } 
} 

Uso Rese t,

using System; 
using System.Threading; 
namespace ThreadingInCSharp.Signaling 
{ 
    class Program 
    { 
     static EventWaitHandle _waitHandle = new AutoResetEvent(false); 
     static void Main(string[] args) 
     { 
      //The event's state is Signal 
      _waitHandle.Set(); 
      _waitHandle.Reset(); 
      new Thread(Waiter).Start(); 
      Thread.Sleep(2000); 
      _waitHandle.Set(); 
      Console.ReadKey(); 
     } 

     private static void Waiter() 
     { 
      Console.WriteLine("I'm Waiting..."); 
      _waitHandle.WaitOne(); 
      //The word will wait 2 seconds for printing 
      Console.WriteLine("pass"); 
     } 
    } 
}