我想知道是否有任何混合 EventWaitHandle 会在调用 .Set() 时自动重置其状态,因为 AutoResetEvent 正在执行此操作,同时将允许执行 .WaitOne() 的每个人通过与 ManualResetEvent 相同的操作。
我想出的唯一一个解决方案是使用 ManualResetEvent 并执行以下操作的非常丑陋的解决方案:
event.Set();
Thread.Sleep(100);
event.Reset();
这样做的更好方法是什么?
谢谢。
更新:
感谢汉斯,我想出了以下解决方案。
看起来它有效:
class HybridWaitHandle
{
private bool signal = false;
private readonly object locker = new object();
private int blocked = 0;
void WaitOne()
{
lock (locker)
{
blocked++;
while (!signal) Monitor.Wait(locker);
blocked--;
if (blocked == 0)
signal = false;
}
}
void Set()
{
lock (locker)
{
signal = true;
Monitor.PulseAll(locker);
}
}
}
最佳答案
请改用 Monitor.PulseAll()。称为“有界缓冲区”,示例代码is here .在 .NET 4 中作为 BlockingCollection<> 可用。
关于c# - AutoResetEvent 和 ManualResetEvent 之间的混合,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/7585033/