ManualResetEvent
here を使用して、同時環境での内部アクションが同時に呼び出されないようにすることmyMethod()
ができるかどうかを判断しようとしています。
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
}
}
編集- 潜在的にタイムアウトを追加できるようにしたいので、lock() の代わりに ManualResetEvent を使用していることに注意してください。