考虑以下模式:
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(); }
版权声明:本文内容由互联网用户自发贡献,该文观点与技术仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 dio@foxmail.com 举报,一经查实,本站将立刻删除。