【发布时间】:2013-08-29 14:32:14
【问题描述】:
我正在使用一个使用 ManualResetEvent 同步线程的应用程序。 FxCop 告诉我处置这些物品。我发现以下讨论告诉我同样的事情:
Do I need to Dispose() or Close() an EventWaitHandle?
但我不知道何时处置 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() 调用之后释放它会释放它多次,并且可能会在其他线程仍在等待时释放它。
创建事件的线程没有对它的任何引用。 setter-thread 不应该释放它,因为还有其他线程在等待这个 MRE。每个等待的线程都不能像前面提到的那样处理它。
所以问题是:这个 ManualResetEvent 应该在什么时候被释放?
【问题讨论】:
-
代码是无意义的,只有 一个 的 MRE 实例。在方法结束时处理它就可以了。
-
不,我不这么认为。创建 MRE 的代码是一个按钮单击事件处理程序。您可以多次单击它来创建多个 MRE。上面的代码被简化了。在此方法结束时处理 MRE 将不起作用,因为在方法完成后有 11 个线程正在使用此 MRE。 setter-thread 等待 10 秒,其他 10 个线程正在等待这个 MRE。
标签: c# .net multithreading idisposable manualresetevent