2012-02-27 5 views
2

.NET(C#)のマルチスレッドサーバー内に "instrumentation"を作成しています。イベントに影響を与えずにAutoResetEventの値を確認してください。

これは、値を変更するために心配することなく、.NET ManualResetEventの値をチェックするために、かなり簡単です:

aManualResetEvent.WaitOne(0); 

は、イベントに待たずにブール値を返します。

しかし、私はAutoResetEventから同じ情報を得ることに迷っているようです。 setイベントでanAutoResetEvent.WaitOne(0)を呼び出すと、(定義によって)戻っている間にイベントがリセットされます。

私はこの時点で決定することができます最良のオプションは、ManualResetEventAutoResetEventを変更し、手動で実際にイベントをテストするときにリセットすることです:

ManualResetEvent theEventFormerlyKnownAsAutoResetEvent; 
... 


// Using the event: 
if (theEventFormerlyKnownAsAutoResetEvent.WaitOne(timeout) 
{ 
    theEventFormerlyKnownAsAutoResetEvent.Reset(); 
    ... 
} 
... 

// Instrumentation to get event state (shouldn't change anything): 
bool eventIsSet = theEventFormerlyKnownAsAutoResetEvent.WaitOne(0); 
// Update instrumentation 

AutoResetEventの状態を確認する良い方法はありますか?可能であれば、AutoResetEventの固有の原子性を好むでしょう。

+0

それはあなたがそれをチェックした直後に他の誰かがイベントをクリアするかもしれないので、役に立たないでしょう。 – SLaks

+0

あなたはあなたがもうそこにいないかもしれない何かを見ているので、その推論では、視力は役に立たない。 –

+0

はい、ここでの全体の点は原子性です。 – SLaks

答えて

0

AutoResetEventのポイントは、イベントがシグナル状態に移行したときに待機中のスレッドを1つだけ解放することです。あるスレッドで特定の処理を行うためにシグナル状態を使用した場合は、別のスレッドがイベントのシグナルを待つことがある場合、スレッド間の競合状態やデッドロックが発生する可能性があります。理由はAutoResetEventです。

あなたが達成しようとしていることについてもっと詳しく説明すると、誰かが助けになる代替手段を提供する可能性があります。

+0

イベントの状態について計装を構築しようとしています。 AutoResetEventをトリガーすることなくAutoResetEventの状態を知りたいと思っています。つまり、関連のない表示設定を変更する場合を除いて、データを参照した結果としてアクションを実行することはできません。 –

+0

これは、サポートされているものではありません。その情報を得るために、基礎となるWin32 APIには何もありません。あなたは 'Wait'コールの後にコードのどこかにフラグを設定しなければなりません。 –

+0

私はそれほど疑わしいと思います。それに、間違った手(鉱山を含む)で危険なことになる... –

関連する問題