我认为在我的代码中,Dispatcher.Invoke(action)在操作完成之前返回(几个小时后)
我的问题: Dispatcher.Invoke(操作)是否有默认超时?
由于
Isaac Dagan
答案 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);
}
}
您可以更深入地探索调用链。
因此,在这种情况下,没有超时。它可以因其他原因而停止,但不是因为最初设置了超时。