Dispatcher.Invoke() have timeout?



我认为在我的代码中,Dispatcher.Invoke(action(在操作完成之前返回(几个小时后(

我的问题:调度程序.Invoke(action( 是否有默认超时?

谢谢

艾萨克·达甘

No.文档没有提到它。如果您打开调度程序的源代码,则可以确保没有超时

public void Invoke(Action callback)
{
  Invoke(callback, DispatcherPriority.Send, CancellationToken.None, TimeSpan.FromMilliseconds(-1));
}

TimeSpan.FromMilliseconds(-1)是一个特殊值,稍后在几个验证中使用:

public void Invoke(Action callback, DispatcherPriority priority, CancellationToken cancellationToken, TimeSpan timeout)
{
  ...
  if(timeout.TotalMilliseconds < 0 && timeout != TimeSpan.FromMilliseconds(-1))
  {
    throw new ArgumentOutOfRangeException("timeout");
  }
  ...
}

后来:

private object InvokeImpl(DispatcherOperation operation, CancellationToken cancellationToken, TimeSpan timeout)
{
  ...
  Debug.Assert(timeout.TotalMilliseconds >= 0 || timeout == TimeSpan.FromMilliseconds(-1));
  ...
  InvokeAsyncImpl(operation, cancellationToken);
  ...
  if(timeout.TotalMilliseconds >= 0)
  {
    // Create a CancellationTokenSource that will abort the
    // operation after the timeout.  Note that this does not
    // cancel the operation, just abort it if it is still pending.
    ctsTimeout = new CancellationTokenSource(timeout);
    ctTimeout = ctsTimeout.Token;
    ctTimeoutRegistration = ctTimeout.Register(s => ((DispatcherOperation)s).Abort(), operation);
  }
}

您可以更深入地探索呼叫链。

因此,在这种情况下,没有超时。它可以由于其他原因而停止,但不是因为最初设置了超时。

相关内容

最新更新