15

私は考えていた 、

trueの ctor にa を渡したいと思うのはなぜ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)?
4

3 に答える 3

11

シナリオは、呼び出した最初のスレッドがWaitOneブロックせずにすぐに通過する必要があるというものです。

AutoResetEventの Silverlight ドキュメントを確認してください(奇妙なことに、ドキュメントは .Net バージョンでは同じではありません)。

trueforを指定すると、シグナル状態の がinitialState作成されます。これは、ブロックせずにすぐに解放されるAutoResetEventのを待っている最初のスレッドが必要な場合に便利です。」AutoResetEvent

于 2012-12-05T08:56:29.483 に答える
9

ここに良い説明があります:イベント待機ハンドルを使用したシグナリング

言い換えると、待機ハンドルは回転式改札口のようなものであり、呼び出し元は回転式改札口にWaitOne並んでいる人々の列のようです。毎回Set呼び出されると、改札口は1人の人を通過させます(通常はキューに入れられた順序で、OSの癖のためにそうでない場合もあります)。

'true'で構築されている場合、回転式改札口はすでに開いていますが、1人だけであるため、の最初の発信者はWaitOneすぐに'通過'しますが、後続の発信者は引き続きキューに入れる必要があります。

明らかに、の呼び出し元が1つしかない場合は、これは適用されないWaitOneため、「true」オプションは無効になります。

于 2012-12-05T09:07:34.200 に答える
1

もちろん。

1 つの要件 - スレッド X は、アプリの開始時とその後 10 秒ごとに実行する必要があります。時間指定された WaitForSingleObject(myARE,10000) がその仕事をします。ARE を「true」に初期化すると、起動時にスレッドが確実に実行されます。

編集:

myARE.WaitOne(10000);

申し訳ありません - C# モードから WINAPI にドロップアウトしました。簡単に :(

于 2012-12-05T09:46:03.163 に答える