我正在使用一个应用程序,该应用程序使用ManualResetEvent同步线程。FxCop告诉我要处理这些对象。我找到了以下讨论,告诉我同样的事情:Do I need to Dispose() or Close() an EventWaitHandle? 但我不知道何时处理ManualResetEvent实例。下面的简化代码演示了问题:
问题在于存在多个ManualResetEvent实例,且多个线程正在等待每个实例。
如果我将实例记忆在列表中,我不知道何时应该处理它。在WaitOne()调用后处理它会导致多次处理并且可能会在其他线程仍在等待时被处理。
创建事件的线程没有任何对它的引用。设置线程不应该处理它,因为还有其他线程正在等待这个MRE。正如前面提到的,每个等待线程都无法处理它。
所以问题是:何时应该处理此ManualResetEvent?
private void btn_Click(object sender, EventArgs e)
{
var mre = new ManualResetEvent(false);
new Thread(() => this.SetEvent(mre)).Start();
for (int i = 0; i < 10; ++i)
{
new Thread(() => this.WaitFor(mre)).Start();
}
}
private void SetEvent(ManualResetEvent manualResetEvent)
{
Thread.Sleep(10000);
manualResetEvent.Set();
}
private void WaitFor(ManualResetEvent manualResetEvent)
{
manualResetEvent.WaitOne();
}
问题在于存在多个ManualResetEvent实例,且多个线程正在等待每个实例。
如果我将实例记忆在列表中,我不知道何时应该处理它。在WaitOne()调用后处理它会导致多次处理并且可能会在其他线程仍在等待时被处理。
创建事件的线程没有任何对它的引用。设置线程不应该处理它,因为还有其他线程正在等待这个MRE。正如前面提到的,每个等待线程都无法处理它。
所以问题是:何时应该处理此ManualResetEvent?