560

これに関するドキュメントを読みましたが、理解していると思います。AutoResetEventコードが を通過すると はリセットされますが、 はリセットされませevent.WaitOne()ManualResetEvent

これは正しいです?

4

11 に答える 11

964

はい。料金所とドアの違いのようなものです。これManualResetEventは、手動で閉じる (リセットする) 必要があるドアです。はAutoResetEvent料金所で、1 台の車が通過すると、次の車が通過する前に自動的に閉じます。

于 2008-09-30T17:03:07.443 に答える
134

andが単一のアトミック操作としてAutoResetEvent実行されることを想像してみてください。WaitOne()Reset()

于 2008-09-30T18:55:59.093 に答える
60

短い答えはイエスです。最も重要な違いは、AutoResetEvent では 1 つの待機中のスレッドしか続行できないことです。一方、ManualResetEvent は、スレッドを停止する (リセットする) ように指示するまで、複数のスレッドを同時に続行できるようにします。

于 2008-09-30T16:59:22.273 に答える
36

ジョセフ・アルバハリによるC#3.0の簡単な本から引用

C#でのスレッド化-無料の電子書籍

ManualResetEventは、AutoResetEventのバリ​​エーションです。これは、WaitOne呼び出しでスレッドが通過した後、自動的にリセットされないという点で異なります。したがって、ゲートのように機能します。Setを呼び出すと、ゲートが開き、ゲートでWaitOneが通過する任意の数のスレッドが許可されます。Resetを呼び出すとゲートが閉じ、ウェイターのキューが次に開くまで蓄積される可能性があります。

ブール値の「gateOpen」フィールド(volatileキーワードで宣言)と「spin-sleeping」を組み合わせてこの機能をシミュレートできます。フラグを繰り返しチェックしてから、短時間スリープします。

ManualResetEventsは、特定の操作が完了したこと、またはスレッドの初期化が完了して作業を実行する準備ができていることを通知するために使用されることがあります。

于 2008-12-04T07:47:25.240 に答える
16

autoResetEvent.WaitOne()

と類似しています

try
{
   manualResetEvent.WaitOne();
}
finally
{
   manualResetEvent.Reset();
}

アトミック操作として

于 2015-06-23T14:37:00.090 に答える
7

はい。これは絶対に正しいです。

状態を示す方法として、ManualResetEvent を見ることができます。何かがオン (セット) またはオフ (リセット) です。ある程度の期間の発生。その状態が発生するのを待っているスレッドは、続行できます。

AutoResetEvent はシグナルに似ています。何かが起こったことを示す一発の兆候。持続時間のない出来事。通常、発生した「何か」は小さく、単一のスレッドで処理する必要がありますが、必ずしもそうとは限りません。したがって、単一のスレッドがイベントを消費した後の自動リセットです。

于 2008-09-30T17:36:05.150 に答える
7

はい、そうです。

この 2 つの使い方からアイデアを得ることができます。

一部の作業が終了し、これを待っている他の (スレッド) が続行できるようになったことを伝える必要がある場合は、ManualResetEvent を使用する必要があります。

リソースへの相互排他的アクセスが必要な場合は、AutoResetEvent を使用する必要があります。

于 2012-04-20T08:48:18.717 に答える