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/

相关文章:

Java多线程可伸缩性问题

java - 如何在多线程应用程序中高效使用 RestTemplate?

.net - 如何使单个事件处理程序处理ALL Button.Click事件?

c# - 插入符号停止 TextBox WPF 中的闪烁事件

c# - 命令执行期间遇到 MySQL fatal error - 循环遍历文件夹中的所有 csv 文件以加载数据本地 infile

c# - 为什么用未检查的(Environment.TickCount * 31)初始化一个新的Random()?

c# - 选择第 n 个重复行之后的下一行

c# - 关闭分页的更简单方法

c - 什么时候应该忽略关键部分以及什么时候不需要等待?开放式MP

events - Scala 中的惯用事件引擎