15

我在想 ,

为什么我想true在 ctor 中传递 a 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");
  }

输出 :

AAA...(delay)...BBB

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

AAABBB

问题

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

3 回答 3

11

这种情况是调用的第一个WaitOne线程应该立即通过,而不会阻塞。

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

指定trueforinitialState创建一个AutoResetEvent处于信号状态。如果您希望第一个等待AutoResetEvent立即释放而不阻塞的线程,这将很有用。”

于 2012-12-05T08:56:29.483 回答
9

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

套用句,等待句柄就像一个旋转门,来电者WaitOne就像一排人在旋转门前排队。每次Set被调用时,旋转门都允许一个人通过(通常按照他们排队的顺序,但有时由于操作系统的怪癖而不是)。

如果它是用'true'构造的,那么闸机已经打开了,但只对一个人开放,这样第一个呼叫者WaitOne将立即“让通过”,但任何后续呼叫者仍然需要排队。

显然,如果您只有一个 的调用者,则这些都不适用WaitOne,因此“真实”选项将没有实际意义。

于 2012-12-05T09:07:34.200 回答
1

当然。

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

编辑:

myARE.WaitOne(10000);

抱歉 - 我从 C# 模式退出到 WINAPI,简单地说:(

于 2012-12-05T09:46:03.163 回答