Если вы используете ManualResetEvent
с анонимными методами, тогда это, очевидно, полезно. Но, как упомянул Сэм, их часто можно передавать рабочим, а затем устанавливать и закрывать.
Так что я бы сказал, что это зависит от контекста того, как вы его используете - пример кода MSDN WaitHandle.WaitAll () имеет хороший пример того, что я имею в виду.
Вот пример, основанный на образце MSDN того, как при создании WaitHandles с оператором using
возникнет исключение:
System.ObjectDisposedException
«Безопасная ручка закрыта»
const int threads = 25;
void ManualWaitHandle()
{
ManualResetEvent[] manualEvents = new ManualResetEvent[threads];
for (int i = 0; i < threads; i++)
{
using (ManualResetEvent manualResetEvent = new ManualResetEvent(false))
{
ThreadPool.QueueUserWorkItem(new WaitCallback(ManualWaitHandleThread), new FileState("filename", manualResetEvent));
manualEvents[i] = manualResetEvent;
}
}
WaitHandle.WaitAll(manualEvents);
}
void ManualWaitHandleThread(object state)
{
FileState filestate = (FileState) state;
Thread.Sleep(100);
filestate.ManualEvent.Set();
}
class FileState
{
public string Filename { get;set; }
public ManualResetEvent ManualEvent { get; set; }
public FileState(string fileName, ManualResetEvent manualEvent)
{
Filename = fileName;
ManualEvent = manualEvent;
}
}