3

.NET (C#) でマルチスレッド サーバー内に「インストルメンテーション」を作成しています。

ManualResetEvent値の変更を気にせずに .NET の値を確認するのはかなり簡単です。

aManualResetEvent.WaitOne( 0 );

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

AutoResetEventただし、 ;から同じ情報を取得するのに途方に暮れているようです。イベントを呼び出すanAutoResetEvent.WaitOne( 0 )と、set返されるときにイベントがリセットされます (定義による)。

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

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可能であれば、の本質的な原子性を好みます。

4

1 に答える 1

0

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

あなたが達成しようとしていることについてより詳細な情報を提供すると、誰かが役立つ代替案を提供できるかもしれません。

于 2012-09-05T18:56:29.517 に答える