2012-12-05 1 views
13

私が思っていた、 新しいAutoResetEvent(true)C#での使用?

なぜ私が今まで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 _waitHandle = new AutoResetEvent (true);、出力は次のようになります。

AAABBB 

質問

  • 私が今までにしたいと思うのはなぜ これをする ? (trueに合格)?

答えて

9

シナリオは、WaitOneを呼び出し最初スレッドが直ちに遮断することなく、通過する必要があることであろう。

チェックSilverlight documentation for AutoResetEvent(奇妙なドキュメントは、.NETのバージョンで同じではありません):initialStateため

trueを指定

が シグナル状態でAutoResetEventを作成します。あなたはAutoResetEventが ブロックせずに、すぐに解放されるために 待機している最初のスレッドをしたい場合に便利です「

+1

の言葉「のリリースでは、」非常に混乱していますが、スレッドCPUのタイムスライスをリリースしているように思え、。実際には '.WaitOne()'の呼び出しを続けているようにしています。 – newprint

+0

あなたはそうです、混乱します。そのドキュメントページにコメントを追加しました – jeroenh

7

ここに良い説明があります:。。Signaling with Event Wait Handles

、待機ハンドルを言い換えすることですWaitOneの発信者は、ターンスタイルで待ち行列に並んでいる人のようなものです。Setが呼び出されるたびに、ターンスタイルで1人の人が(通常、キューに入れられた順序で実行されますが、OSの癖のために) 。

'true'で構成されている場合は、開店者はすでに開かれていますが、最初の発信者がWaitOneになるように1人だけですが、後続の発信者はそのまま待ちます。

明らかに、WaitOneという発信者が1人しかいない場合、「true」オプションはごめんねです。

1

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

編集:

myARE.WaitOne(10000); 

申し訳ありません - 私は簡単に、WINAPIにC#のモードを中退:(

+0

ありがとう@jeroenh - 私はコードブロックを自分で追加しようとしましたが、私のISPは今日、DNSを断続的にアップ/ダウンしています:( –

関連する問題