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

在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与取消标记一起使用。 在这种情况下,三件事情之一将会发生:

  1. 一旦事件发出信号,等待操作将立即完成(在超时完成之前)。
  2. 如果事件没有在超时时间发出信号,则等待操作将以false结束。
  3. 如果在等待操作过程中设置了取消令牌,则会抛出OperationCanceledException异常。

如果你设置事件信号,它将释放等待的线程;