加入收藏 | 设为首页 | 会员中心 | 我要投稿 李大同 (https://www.lidatong.com.cn/)- 科技、建站、经验、云计算、5G、大数据,站长网!
当前位置: 首页 > 百科 > 正文

c# – AutoResetEvent在Set之后立即重置

发布时间:2020-12-15 08:32:57 所属栏目:百科 来源:网络整理
导读:考虑以下模式: private AutoResetEvent signal = new AutoResetEvent(false);private void Work(){ while (true) { Thread.Sleep(5000); signal.Set(); //has a waiting thread definitely been signaled by now? signal.Reset(); }}public void WaitForNex
考虑以下模式:
private AutoResetEvent signal = new AutoResetEvent(false);

private void Work()
{
    while (true)
    {
        Thread.Sleep(5000);
        signal.Set();
        //has a waiting thread definitely been signaled by now?
        signal.Reset();
    }
}

public void WaitForNextEvent()
{
    signal.WaitOne();
}

此模式的目的是允许外部消费者等待某个事件(例如 – 消息到达).不从类中调用WaitForNextEvent.

举一个应该熟悉的例子,考虑System.Diagnostics.Process.它公开了一个Exited事件,但它也公开了一个WaitForExit方法,该方法允许调用者同步等待,直到进程退出.这就是我想在这里实现的目标.

我需要signal.Reset()的原因是,如果一个线程在signal.Set()被调用之后调用WaitForNextEvent(换句话说,如果没有线程在等待时调用.Set),它会立即返回,如事件已经预先发出信号.

这个问题

>在调用signal.Reset()之前,是否可以保证调用WaitForNextEvent()的线程?如果没有,实现WaitFor方法的其他解决方案是什么?

解决方法

而不是使用AutoResetEvent或ManualResetEvent,使用此:
public sealed class Signaller
{
    public void PulseAll()
    {
        lock (_lock)
        {
            Monitor.PulseAll(_lock);
        }
    }

    public void Pulse()
    {
        lock (_lock)
        {
            Monitor.Pulse(_lock);
        }
    }

    public void Wait()
    {
        Wait(Timeout.Infinite);
    }

    public bool Wait(int timeoutMilliseconds)
    {
        lock (_lock)
        {
            return Monitor.Wait(_lock,timeoutMilliseconds);
        }
    }

    private readonly object _lock = new object();
}

然后像这样更改你的代码:

private Signaller signal = new Signaller();

private void Work()
{
    while (true)
    {
        Thread.Sleep(5000);
        signal.Pulse(); // Or signal.PulseAll() to signal ALL waiting threads.
    }
}

public void WaitForNextEvent()
{
    signal.Wait();
}

(编辑:李大同)

【声明】本站内容均来自网络,其相关言论仅代表作者个人观点,不代表本站立场。若无意侵犯到您的权利,请及时与联系站长删除相关内容!

    推荐文章
      热点阅读