在Microsoft .NET中,对于方法WaitOne()
public virtual bool WaitOne( TimeSpan timeout )
如果当前实例收到一个信号,它将返回true; 否则,是错误的。
我的问题是,有没有办法让它返回假,即使超时点还没有到来?
要么
换句话说,即使实际的超时点还没有到来,是否有办法立即触发WaitOne()的超时?
更新:
该项目基于.NET 3.5 ,因此ManualResetEventSlim可能无法工作(在.NET 4中引入)。 感谢@ani无论如何。
你不能取消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, 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; }
看来你要等待一段时间的信号,同时也可以取消正在进行的等待操作。
实现此目的的一种方法是使用Wait(TimeSpan timeout, CancellationToken cancellationToken)
方法将ManualResetEventSlim
与取消标记一起使用。 在这种情况下,三件事情之一将会发生:
如果你设置事件信号,它将释放等待的线程;