微信公众号搜"智元新知"关注
微信扫一扫可直接关注哦!

任何方式立即触发WaitOne的超时?

在Microsoft .NET中,对于方法WaitOne()

public virtual bool WaitOne( TimeSpan timeout )

如果当前实例收到一个信号,它将返回true; 否则,是错误的。

我的问题是,有没有办法让它返回假,即使超时点还没有到来?

要么

换句话说,即使实际的超时点还没有到来,是否有办法立即触发WaitOne()的超时?

更新:

删除C#中的文本文件的第一行

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] 举报,一经查实,本站将立刻删除。

相关推荐