【发布时间】:2017-10-04 19:35:55
【问题描述】:
类似于this question 我有一个带有私有 ManualReset 事件的类:
class A {
private ManualResetEvent mre = new ManualResetEvent(true);
private void Method(){
//do something
mre.Reset();
}
public bool WaitForItem(int timeout){
try{
return mre.WaitOne(timeout)
}catch(ObjectDisposedException){
return false;
}
}
public void Dispose(){
mre.Dispose();
}
}
我如何检查 Dispose 何时被调用 WaitForItem 方法返回 false,并且不会阻塞等待。
代码类似于:
A a = new A(1);
a.Method();
bool finished = true;
Thread t1 = new Thread(() =>
{
finished = a.WaitForItem(Timeout.Infinite);
});
Thread t2 = new Thread(() =>
{
a.Dispose();
});
t1.Start();
t2.Start();
t1.Join();
t2.Join();
永远等待一个项目的代码块(t1.Join())。我知道调用Close,这也是处理对象的一种方式,不会影响句柄的状态,但是我怎样才能以false退出方法(捕获ObjectDisposedException)?
即使不是在第二个线程上调用 a.Dispose() 而是调用另一个处理 ManualResetEvent 的方法,而是调用 WaitOne() 它被阻塞了。
【问题讨论】:
-
您遇到此问题表明您的应用程序设计存在问题。但如果你真的需要这样做,试试
ManualResetEventSlim并使用Wait(CancellationToken) 方法。只需在处理 MRE 之前更改您的Dispose方法以设置取消令牌。不过,老实说,您需要重新考虑您的设计。这样的事情真的不应该是必要的。
标签: c# multithreading