我試圖確定我是否可以在這裏使用ManualResetEvent
以確保在併發環境中,myMethod()
的內部操作是從不調用。ManualResetEvent - 這裏會出現競爭狀況嗎?
static volatile bool _syncInitialized = false;
static ManualResetEvent _syncEvent = new ManualResetEvent(false);
static object _syncLock = new object();
void myMethod()
{
lock (_syncLock)
{
if (!_syncInitialized) // sync hasn't started, so
{
_syncInitialized = true;
_syncEvent.Set(); // signal for the first time only
}
}
if (_syncEvent.WaitOne()) // wait for signal
{
_syncEvent.Close();
_syncEvent = new ManualResetEvent(false); // reset to false
// actions that should be forced to run sequentially
}
}
編輯 - 請注意,我使用的ManualResetEvent而不是隻鎖定(),因爲我希望能夠增加超時,有可能。
但鎖應該一次運行您的代碼一個線程,爲什麼使用ManualResetEvent? – Christian
MRE只對信號有用,它不**提供排除。使用* lock *關鍵字,Mutex或Semaphore。 –
@基督教,好問題。如有必要,使用ManualResetEvent,以便在WaitOne()上使用超時。 –