C#中的新AutoResetEvent(true)用法?

C#中的新AutoResetEvent(true)用法?,c#,.net,multithreading,autoresetevent,C#,.net,Multithreading,Autoresetevent,我在想 为什么我要在AutoResetEvent的ctor中传递true 我创建了一个waitHandle,这样任何调用WaitOne()的人实际上都会等待 如果我用一个true来实例它,就好像它是立即发出信号的——这就像没有等待的正常流程一样 EventWaitHandle _waitHandle = new AutoResetEvent (false); void Main() { new Thread (Waiter).Start(); Thread.Sleep (100

我在想

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

我创建了一个
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\u waitHandle=new AutoResetEvent(true)和输出将为:

AAABBB
问题

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

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

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

      initialState
      指定
      true
      将在中创建一个
      AutoResetEvent
      发出信号的状态。如果希望第一个线程 等待
      AutoResetEvent
      立即释放,无需任何提示 阻挡。”


      这里有一个很好的解释:

      换言之,等待手柄就像一个旋转栅门,
      WaitOne
      的呼叫者就像一排人在旋转栅门前排队。每次调用
      Set
      ,旋转栅门都允许一个人通过(通常按照他们排队的顺序,但有时由于操作系统的特殊性而不允许)

      如果它是用“true”构造的,则旋转栅门已经打开,但只对一个人开放,因此
      WaitOne
      的第一个呼叫者将立即“通过”,但任何后续呼叫者仍必须排队

      显然,如果您只有一个调用方
      WaitOne
      ,那么这一切都不适用,因此“true”选项将毫无意义。

      当然

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

      编辑:


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

      谢谢@jeroenh-我试图自己添加代码块,但我的ISP今天又出现了问题,DNS上下断断续续:(单词“release”非常混乱。看起来你在释放线程CPU时间片,但实际上你让它在
      .WaitOne()之后继续工作)
      call。你说得对,这让人困惑。我在文档页面上添加了一条评论。
      myARE.WaitOne(10000);