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

时间:2012-12-05 08:48:23

标签: c# .net multithreading autoresetevent

我在想,

为什么我想要在true的ctor中传递AutoResetEvent

我创建了一个waitHandle,以便任何致电WaitOne()的人实际上等待

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

输出:

AAA...(delay)...BBB

更改为:EventWaitHandle _waitHandle = new AutoResetEvent (true);,输出将为:

AAABBB

问题

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

3 个答案:

答案 0 :(得分:10)

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

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

  

true指定initialState会在AutoResetEvent中创建AutoResetEvent   信号状态。如果你想要第一个线程,这很有用   等待{{1}}立即释放,没有   堵“。

答案 1 :(得分:7)

这里有一个很好的解释:Signaling with Event Wait Handles

换句话说,等待句柄就像一个旋转门,WaitOne的来电者就像一排排在十字转门的人。每次调用Set时,旋转门允许一个人通过(通常按照他们排队的顺序,但有时不会,因为操作系统怪癖)。

如果构造为'true',则旋转栅门已经打开,但只有一个人,因此WaitOne的第一个调用者将立即“通过”,但任何后续调用者都将仍然要排队。

显然,如果你只有一个WaitOne的来电者,那么这一切都不适用,所以“真实”选项没有实际意义。

答案 2 :(得分:1)

不确定。

一个要求 - 线程X必须在应用程序启动时运行,之后每10秒运行一次。一个定时的WaitForSingleObject(myARE,10000)可以完成这项工作。将ARE初始化为'true'将确保线程在启动时运行。

编辑:

myARE.WaitOne(10000);

抱歉 - 我暂时退出了C#模式进入WINAPI :(