[英]C# - Dispatcher.InvokeAsync ContinueWith not awaited
[英]WPF Dispatcher.InvokeAsync() strange behavior with async delegate
如果您有一个异步方法,例如以下方法:
private async Task DoAsync()
{
Console.WriteLine(@"(1.1)");
Thread.Sleep(200);
Console.WriteLine(@"(1.2)");
await Task.Delay(1000);
Console.WriteLine(@"(1.3)");
}
然后使用Dispatcher异步调用它:
Console.WriteLine(@"(1)");
await Application.Current.Dispatcher.InvokeAsync(DoAsync);
Console.WriteLine(@"(2)");
您将获得的输出将是:(1)(1.1)(1.2)(2)(1.3)
如果使用Dispatcher.BeginInvoke()并等待Completed事件,则效果将是相同的(预期):
Console.WriteLine(@"(1)");
var dispatcherOp = Dispatcher.BeginInvoke(new Func<Task>(DoAsync));
dispatcherOp.Completed += (s, args) =>
{
Console.WriteLine(@"(2)");
};
我们在这里看到的是,DoAsync()方法中的await使Dispatcher相信操作已结束。
我的问题:是错误还是功能? 您是否知道任何描述此行为的文档? 我什么都找不到。
我不是在寻求解决方法。
这是您代码中的错误,该错误是从Application.Current.Dispatcher.InvokeAsync(DoAsync);
返回的对象Application.Current.Dispatcher.InvokeAsync(DoAsync);
是Task<Task>
,您仅等待外部任务,而不等待内部任务完成。 这些情况就是.Unwrap()
的用途。
Console.WriteLine(@"(1)");
await Application.Current.Dispatcher.InvokeAsync(DoAsync).Unwrap();
Console.WriteLine(@"(2)");
您将获得的输出将是:(1)(1.1)(1.2)(1.3)(2)
Unwrap所做的就是有效地将您的代码
Console.WriteLine(@"(1)");
await (await Application.Current.Dispatcher.InvokeAsync(DoAsync));
Console.WriteLine(@"(2)");
但具有更好的外观格式。
有关文档,请参阅“ 如何:解开嵌套任务 ”
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.