3

スレッド管理のウェイターを使用しました。

SyncLock http://msdn.microsoft.com/en-us/library/3a86s51t%28v=vs.71%29.aspx

しかし今、タイムアウトが欲しかったので、WaitOne を見つけました。

単純なタイムアウトをサポートするWaitOne http://msdn.microsoft.com/en-us/library/system.threading.waithandle.waitone.aspx 。

しかし、それはもう機能しません。障害がコードの別の場所にある可能性があります。あなたへの私の主な質問は、基本的なウェイター フラグとして使用することSyncLockと使用することに違いはありますか?WaitOne

よろしく

4

2 に答える 2

4

SyncLockMonitor.Enterとの言語固有のラッパーですMonitor.Exit。コードまたはリソースの重要なセクションへの同時アクセスを制限するために使用することを意図しています。

WaitHandle.WaitOneスレッドが外部シグナルを待機する必要があるシナリオで使用するためのメソッドです。それがどのように機能するかの正確な実装とセマンティクスは、クラス固有です。つまり、は、またはと比較してWaitOneから使用すると、異なる動作をします。AutoResetEventManualResetEventSemaphore

この 2 つは、実際には異なるユース ケースを対象としています。特定の問題のより良い説明がなければ、どれを使用するのが最適かを推測することさえ困難です.

SyncLockただし、(またはMonitorクラスを介して) ロックのセマンティクスが必要であることが確実にわかっている場合はMonitor.TryEnter、timeout パラメーターを提供する which dos を使用できます。

于 2011-09-08T13:19:50.420 に答える
2

MSDN からhttp://msdn.microsoft.com/en-us/library/ms173179.aspx

ロックまたはモニターを使用すると、スレッドに依存するコード ブロックの同時実行を防ぐことができますが、これらの構造では、あるスレッドが別のスレッドにイベントを伝達することはできません。これには同期イベントが必要です。同期イベントは、スレッドのアクティブ化と一時停止に使用できる、シグナル状態と非シグナル状態の 2 つの状態のいずれかを持つオブジェクトです。スレッドは、非シグナル状態の同期イベントを待機させることで一時停止でき、イベント状態をシグナル状態に変更することでアクティブ化できます。スレッドが既に通知されているイベントを待機しようとすると、スレッドは遅延なく実行を続けます。

同期イベントには、AutoResetEvent と ManualResetEvent の 2 種類があります。これらは、スレッドをアクティブ化するたびに AutoResetEvent がシグナル状態から非シグナル状態に自動的に変化するという点のみが異なります。逆に、ManualResetEvent では、シグナル状態によって任意の数のスレッドをアクティブにすることができ、Reset メソッドが呼び出されたときにのみ非シグナル状態に戻ります。

スレッドは、WaitOne、WaitAny、WaitAll などのいずれかの待機メソッドを呼び出して、イベントを待機させることができます。WaitHandle.WaitOne() は、1 つのイベントがシグナル状態になるまでスレッドを待機させ、WaitHandle.WaitAny() は、示された 1 つ以上のイベントがシグナル状態になるまでスレッドをブロックします。合図した。Set メソッドが呼び出されると、イベントが通知されます。

于 2011-09-08T13:22:26.733 に答える