2012-06-12 4 views
7

Monitor.EnterMonitor.Exitは同じスレッドから呼び出されるように設計されています。しかし、取得したスレッドとは異なるスレッドでロックを解除する必要がある場合はどうしたらよいですか?Monitor.EnterとMonitor.Exitを別のスレッドで使用する

たとえば、このリソースを使用する共有リソースと非同期操作があります。操作はBeginOperationで始まり、共有リソースのロックを取得します。また、ロックを解放する方法はEndOperationです。 EndOperationは通常、コールバックから別のスレッドで呼び出されるため、EndOperationメソッドでMonitor.Exitを呼び出すことはできません。この場合の最善のアプローチは何ですか? Monitorの代わりにAutoResetEventでロックを再チェックするのが良い解決策ですか?

+4

"セマフォ"を使用しますか? –

+0

@pst特に 'Semaphore'ではなく' Event'であるのはなぜですか? – eigenein

+0

[Semaphore、SemaphoreSlim、ReaderWriterLock、ReaderWriterLockSlim、ManualResetEvent、ManualResetEventSlim、AutoResetEvent、CountdownEvent、Interlocked、Mutexなどの同期プリミティブを参照してください(http://msdn.microsoft.com/en-us/library/system.threading.aspx ) –

答えて

7

.NET 4.0を使用できる場合は、System.Threading.Semaphoreに置き換えることができます。これにより、あるスレッドで許可を取得し、別のスレッドで許可を取得することができます。

Semaphoreクラスは、 WaitOneまたはReleaseへの呼び出しでスレッドIDを強制しません。

11

あなたが探しているプリミティブは、semaphoreと呼ばれ、1つのスレッドに安全に入力して別のスレッドから終了することができます。

関連する問題