new AutoResetEvent(true)在C#中的用法?

Roy*_*mir 15 .net c# multithreading autoresetevent

我在想 ,

为什么我会永远想通过一个true在构造函数中AutoResetEvent

我创建了一个waitHandle任何打电话的人WaitOne()都会等待.

如果我用a来实例true,它就好像是立即发出信号 - 这就像没有等待的正常流程一样.

  EventWaitHandle _waitHandle = new AutoResetEvent (false);

void Main()
{
  new Thread (Waiter).Start();
    Thread.Sleep (1000);                   
    _waitHandle.Set();                    

Console.ReadLine();
}
  void Waiter()
  {
    Console.WriteLine ("AAA");
    _waitHandle.WaitOne();                 
    Console.WriteLine ("BBBB");
  }
Run Code Online (Sandbox Code Playgroud)

输出:

AAA...(delay)...BBB
Run Code Online (Sandbox Code Playgroud)

改为: EventWaitHandle _waitHandle = new AutoResetEvent (true);并且输出将是:

AAABBB
Run Code Online (Sandbox Code Playgroud)

问题:

  • 我为什么要这样做?(通过true)?

jer*_*enh 10

方案是第一个调用的线程WaitOne应该立即通过,而不会阻塞.

检查Silverlight文档中的AutoResetEvent(奇怪的是,.Net版本上的doc不一样):

指定true用于在信号状态下initialState创建AutoResetEvent.如果你想让第一个等待AutoResetEvent立即释放的线程没有阻塞,这很有用."


Cha*_*nga 7

这里有一个很好的解释:使用事件等待句柄发出信号.

换句话说,等待手柄就像一个旋转门,呼叫者WaitOne就像一排排在旋转门上的人.每次Set调用时,旋转门允许一个人通过(通常按照他们排队的顺序,但有时不是,由于操作系统怪癖).

如果它是用'true'构造的,则旋转栅门已经打开,但是对于只有一个人,所以第一个调用者WaitOne将直接"通过",但任何后续调用者仍然必须排队.

显然,如果你只有一个调用者WaitOne,那么这一切都不适用,所以'true'选项没有实际意义.