我认为在我的代码中,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);
}
}
您可以更深入地探索呼叫链。
因此,在这种情况下,没有超时。它可以由于其他原因而停止,但不是因为最初设置了超时。