Dispatcher.Invoke()有超时吗?

时间:2018-01-15 09:09:22

标签: .net

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

我的问题: Dispatcher.Invoke(操作)是否有默认超时?

由于

Isaac Dagan

1 个答案:

答案 0 :(得分:0)

没有。 文档没有提到它。如果您打开Noam Almosnino的源代码,则可以确保没有超时

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);
  }
}

您可以更深入地探索调用链。

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