在Microsoft .NET中,对于方法WaitOne()
public virtual bool WaitOne( TimeSpan timeout )
如果当前实例收到一个信号,它将返回true; 否则,是错误的。
我的问题是,有没有办法让它返回假,即使超时点还没有到来?
要么
换句话说,即使实际的超时点还没有到来,是否有办法立即触发WaitOne()的超时?
更新:
CustomSettingProvider中的空引用仅在某些机器上
Windows Azure支持除.NET以外的其他技术
构buildWindows资源pipe理器扩展
Ubuntu – 安装.net核心
该项目基于.NET 3.5 ,因此ManualResetEventSlim可能无法工作(在.NET 4中引入)。 感谢@ani无论如何。
Windows服务挂起在启动过程中启动
如何检索窗口的最小化,最大化和closuresbutton的大小?
处理用TrayIcon的ShowBalloonTip()显示的气球提示上的点击
GetSystemTimeZones缺lessGMT标准时间
我应该如何在Windows上创build自定义graphics控制台/terminal?
你不能取消WaitOne,但你可以包装它:
public bool Wait(WaitHandle yourEvent,WaitHandle cancelEvent,TimeSpan timeOut) { WaitHandle[] handles = new WaitHandle[] { yourEvent,cancelEvent }; // WaitAny returns the index of the event that got the signal var waitResult = WaitHandle.WaitAny(handles,timeOut); if(waitResult == 1) { return false; // cancel! } if(waitResult == WaitHandle.WaitTimeout) { return false; // timeout } return true; }
只要通过你想等待的句柄和一个句柄来取消等待和超时。
额外
作为一个扩展方法,所以可以用类似于WaitOne的方式来调用:
public static bool Wait(this WaitHandle yourEvent,timeOut); if(waitResult == 1) { return false; // cancel! } if(waitResult == WaitHandle.WaitTimeout) { return false; // timeout } return true; }
看来你要等待一段时间的信号,同时也可以取消正在进行的等待操作。
实现此目的的一种方法是使用Wait(TimeSpan timeout,CancellationToken cancellationToken)方法将ManualResetEventSlim与取消标记一起使用。 在这种情况下,三件事情之一将会发生:
一旦事件发出信号,等待操作将立即完成(在超时完成之前)。
如果事件没有在超时时间发出信号,则等待操作将以false结束。
如果在等待操作过程中设置了取消令牌,则会抛出OperationCanceledException异常。
如果你设置事件信号,它将释放等待的线程;
版权声明:本文内容由互联网用户自发贡献,该文观点与技术仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 [email protected] 举报,一经查实,本站将立刻删除。