如何在.NET 4.0中请求超时或取消之前"休眠"

Onu*_*nur 52 c# sleep .net-4.0 cancellation cancellationtokensource

什么是睡了一定的时间,但能够被一个中断的最佳方式IsCancellationRequestedCancellationToken

我正在寻找一个适用于.NET 4.0的解决方案.

我想写

void MyFunc (CancellationToken ct)
{
   //... 
   // simulate some long lasting operation that should be cancelable 
   Thread.Sleep(TimeSpan.FromMilliseconds(10000), ct); 
}
Run Code Online (Sandbox Code Playgroud)

Fro*_*ode 108

我刚刚在这里写博客:

CancellationToken和Thread.Sleep

简而言之:

var cancelled = token.WaitHandle.WaitOne(TimeSpan.FromSeconds(5));
Run Code Online (Sandbox Code Playgroud)

在您的上下文中:

void MyFunc (CancellationToken ct)
{
   //... 
   // simulate some long lasting operation that should be cancelable 
   var cancelled = ct.WaitHandle.WaitOne(TimeSpan.FromSeconds(10));
}
Run Code Online (Sandbox Code Playgroud)

  • Onur然后你可以像`token.WaitHandle.WaitOne(5000)`那样做 (4认同)
  • 警告/注意:如果底层 CancellationTokenSource 被释放,访问 `ct.WaitHandle` 会引发异常。使用扩展方法很容易解决.. `ct.WaitForCancellation(timespan)` 如果访问引发异常,它可以立即返回。应与取消令牌检查结合使用,因为可能会导致误导性的“无等待”时间。 (4认同)
  • 但是,文档建议避免使用WaitHandle,除非必要:“访问此属性会导致实例化WaitHandle。最好仅在必要时使用此属性,然后尽早处置关联的CancellationTokenSource实例(处置源将处理此分配的句柄)。” https://msdn.microsoft.com/zh-CN/library/dd321769(v=VS.100,d=hv.2).aspx (2认同)

Fow*_*owl 8

或者,我认为这很清楚:

Task.Delay(waitTimeInMs, cancellationToken).Wait(cancellationToken);

  • 是否真的有必要将 CancellationToken 传递给延迟和等待方法调用?如果给予延迟方法的令牌已取消,Wait 将不会继续阻塞。 (3认同)
  • @Frode的答案更好。原因?忽略“ Wait();”太容易了。最后,没有编译错误,并且根本不会引起任何延迟!我已经被这件事烧死了,以至于我只想完全避免使用这种语法。 (2认同)