如果我调用WaitHandle.Dispose(),等待线程会发生什么?

时间:2009-08-17 14:01:49

标签: .net multithreading idisposable

我有两个ManualResetEvents,我用它来在两个线程之间来回传递控制。基本上是一个协程。

因为协同程序持有一次性对象(ManualResetEvents是等待句柄),所以应该实现一次性对象。此外,它应该在处理时释放那些ManualResetEvents。但是,因为一次只运行一个线程,其中一个(几乎)总是在其中一个句柄上等待。

如果我同时处理两个ManualResetEvents,指定的行为是什么?等待的线程会永远被卡住,还是处理终止等待?如果我先调用.Set()会怎么样?

2 个答案:

答案 0 :(得分:0)

暗示实施ManualResetEvents是不好的做法。 创建由事件拥有的主管类,并使用refcounter模式(每个线程增加/减少使用)在计数器满足0时配置主管。

答案 1 :(得分:0)

我最近遇到了类似的问题,并决定用监视器替换等待句柄以及Marc Gravell herehere描述的等待/脉冲模式。由于监控类是完全托管的,因此您不必担心处置任何资源。当然,您仍然可能需要考虑关闭过程,但等待/脉冲模式对于添加关闭标记等内容更加灵活。