2011-10-12 51 views
2
using System; 
using System.Threading; 

public class Example 
{ 
    // mre is used to block and release threads manually. It is 
    // created in the unsignaled state. 
    private static ManualResetEvent mre = new ManualResetEvent(false); 

    static void Main() 
    { 
     Console.WriteLine("\nStart 3 named threads that block on a ManualResetEvent:\n"); 

     for(int i = 0; i <= 2; i++) 
     { 
      Thread t = new Thread(ThreadProc); 
      t.Name = "Thread_" + i; 
      t.Start(); 
     } 

     Thread.Sleep(500); 
     Console.WriteLine("\nWhen all three threads have started, press Enter to call Set()" + 
          "\nto release all the threads.\n"); 
     Console.ReadLine(); 

     mre.Set(); 

     Thread.Sleep(500); 
     Console.WriteLine("\nWhen a ManualResetEvent is signaled, threads that call WaitOne()" + 
          "\ndo not block. Press Enter to show this.\n"); 
     Console.ReadLine(); 

     for(int i = 3; i <= 4; i++) 
     { 
      Thread t = new Thread(ThreadProc); 
      t.Name = "Thread_" + i; 
      t.Start(); 
     } 

     Thread.Sleep(500); 
     Console.WriteLine("\nPress Enter to call Reset(), so that threads once again block" + 
          "\nwhen they call WaitOne().\n"); 
     Console.ReadLine(); 

     mre.Reset(); 

     // Start a thread that waits on the ManualResetEvent. 
     Thread t5 = new Thread(ThreadProc); 
     t5.Name = "Thread_5"; 
     t5.Start(); 

     Thread.Sleep(500); 
     Console.WriteLine("\nPress Enter to call Set() and conclude the demo."); 
     Console.ReadLine(); 

     mre.Set(); 

     // If you run this example in Visual Studio, uncomment the following line: 
     //Console.ReadLine(); 
    } 

    //thread entry point 
    private static void ThreadProc() 
    { 
     string name = Thread.CurrentThread.Name; 

     Console.WriteLine(name + " starts and calls mre.WaitOne()"); 
     //wait untill signaled 
     mre.WaitOne(); 

     Console.WriteLine(name + " ends."); 
    } 
} 

我写了一个例子来理解autoresetevent和manualresetevent。 但是当我们不得不使用Autoresetevent和manualresetevent synchornization时,还不清楚吗? 上面是这个例子。请提供真实世界场景,我们可以使用基于事件的同步 。autoresetevent和manualresetevent

回答

3

有几个地方使用这种东西。我个人认为通常是宁愿Monitor.Wait/Pulse,但有些时候{手动/自动} ResetEvent更有用 - 尤其是当您希望能够在多个手柄上等待时。

,我已经看到了这个使用的两个最明显的情况是:

  • 生产者/消费者队列:当队列为空时,消费者会等待在监视器上或者等待处理。生产者随后会在添加物品时对监视器/手柄进行脉冲/设置,以唤醒消费者,使其知道它有工作要做。
  • 唤醒一个“睡眠”线程,让它知道它可以退出:有一个while(!ShouldStop) { Work(); Wait(10000); }类型的循环并不罕见; “停止”线程可以再次使等待线程唤醒注意到已经设置了“停止”标志

这些当然是非常相似的场景,毫无疑问,还有更多的 - 但那些是我最常看到的。