c# - AutoResetEvent 和 ManualResetEvent 之间的混合

标签 c# multithreading events

我想知道是否有任何混合 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/

相关文章:

c# - 无法解析 Enumerable 和 Queryable 候选人之间的方法

c# - 有什么方法可以创建一个可能具有不同调用和返回参数对象的方法吗?

java - 使用多个线程是不好的做法吗? (通过 SwingWorkers)

java - 为什么不调用 componentShown()?

C# 事件 : not firing after second level

Java GUI 在鼠标事件上绘制图像

c# - ASP.NET - 检查请求是否在母版页中通过身份验证

c# - 如何模拟 Visual Studio 自动生成的 SOAP 客户端?

java - Android SQL 数据库打开和关闭 - 竞争条件

linux - 即使状态分离,pthread 中的内存泄漏