ロックの代わりにウェイトハンドルをいつ使用する必要がありますか
-
27-10-2019 - |
質問
の C#
, 、いつ使用する必要がありますか WaitHandle
それ以外の lock
?
解決
ロックはaと根本的に異なります WaitHandle
. 。たとえば、あなたが書くロックを使用して:
lock (SomeResource)
{
// do stuff here
}
最初の行には、「私はそのリソースへの排他的アクセスが必要です」と書かれており、そのリソースが利用可能になるまで待ちます(つまり、他の誰もロックを持っている人はいません)。次に、コードが実行され、最後にロックがリリースされ、他の人が使用できるようになります。
WaitHandle
いくつかのイベントが開催されるのを待つために使用されます。あなたが書くとき:
MyWaitHandle.WaitOne();
あなたのコードは、他のスレッド(おそらく別のプロセスで)がそれを知らせるのを待っています WaitHandle
. 。それが何でも信号があるかもしれません。おそらく、別のスレッドがその仕事を終えて、あなたのコードを続ける前に「私は今終わった」と言うのを待っています。
したがって、質問に答えるには、リソースへの排他的なアクセスを取得するときは、ロックを使用する必要があります。使用する必要があります WaitHandle
いくつかのイベントの通知を受けたいとき。
他のヒント
ウェイトハンドルは複数のハンドルを待つことができ、ロックは1つだけを待つことができます。
必要なとき。真剣に、ロックは構文砂糖です Monitor
, 、おそらくウェイトハンドルを内部で使用します。
より柔軟性が必要な場合にのみ(現在のスコープよりも長くロックを保持するなど)、または正しい順序で複数のロックを管理する必要がある場合にのみ使用します。
彼らは完全に異なることを達成します。 a lock
コードの特定のブロックへのアクセスを制限するために使用されます 独身 一度にスレッド。 a WaitHandle
並行性関連クラスの基本クラスです。 Semaphore
, Mutex
, AutoResetEvent
, 、 と ManualResetEvent
, 、これにより、わずかに異なる方法で並行性を制御できます。たとえば、a Semaphore
並行性を制限できます に過ぎません n スレッド、単一のスレッドの代わりに。
WaitHandle
複数のスレッドが実行されている場合によく使用され、他のアクションを続ける前に、それらの1つまたはすべてが完了するのを待ちたいです。 lock
複数のスレッドが共有リソースに同時にアクセスできないようにする場合は、使用されます。
最良の説明は、これら2つのリンクにあります。残念ながら、あなたが尋ねた質問の種類に対する完全な答えを得るために、読書をしなければならないでしょう:
これには例も含まれています。http://msdn.microsoft.com/en-us/library/system.threading.waithandle.aspx