2011-05-03 49 views
12

有人可以引入AutoResetEvent.Reset()方法的用例嗎? 何時以及爲何我想要使用此方法? 我明白WaitOne和Set,但這對我來說還不太清楚。AutoResetEvent復位方法

+4

爲什麼選擇關閉?這個問題似乎對我來說非常明確和有用...... – 2011-05-03 14:33:40

回答

6

是的,AutoResetEvent會自動重置它的狀態,每當正在等待事件的線程發信號。但是,有可能給定的事件不再有效,並且自從最初設置以來,沒有線程在AutoResetEvent上等待。在這種情況下該Reset方法變得有用

+0

但是在這種情況下調用Reset()會有什麼好處? – anth 2011-05-03 15:00:40

+0

@anth它可以防止任何尚未呼叫等待的線程,但會在將來的某個時間點針對不再有效的事件激活。注意:這本身不足以防止競爭條件,但它可以成爲更大解決方案的一部分 – JaredPar 2011-05-03 15:02:40

1

看起來它只是繼承自EventWaitHandle。 ManualResetEvent也可能更有用,該ManualResetEvent也是從該類繼承的?

0

使用Reset()時應使用ManualResetEvent,因爲AutoResetEvent會在線程發出信號時重置自身。

1

該方法繼承自基類EventWaitHandle,用於(重新)將AutoResetEvent設置爲其「已阻止」狀態。

由於AutoResetEvent會在發出信號後立即自動進入該狀態,因此您通常不會在代碼中看到此方法,但對於來自EventWaitHandle的其他類,它會更加有用!

1

如果AutoResetEvent生產者想要清除該事件,則可以使用Reset()。通過這種方式,您可以安全地「重置」事件,而無需知道當前是否發送了信號。如果生產者使用WaitOne來「重置」它自己的事件,則存在死鎖的風險(即,由於事件未被髮信號且生產者線程被阻塞,所以永遠不會返回)。

0

復位

設置爲無信號 事件的狀態,見EventWaitHandle Class

樣品,

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"); 
     } 
    } 
} 

使用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"); 
     } 
    } 
}