我试图创建一个视图模型,其中一些属性是从后台线程加载的。
对于此任务,我在 NotifyTaskCompletion<T>
上找到了
Stephen Cleary撰写的这篇旧 MSDN 文章。 更好的方法部分中列出“图 4”的代码如下所示:
public sealed class NotifyTaskCompletion<TResult> : INotifyPropertyChanged
{
public NotifyTaskCompletion(Task<TResult> task)
{
Task = task;
if (!task.IsCompleted) {
var _ = WatchTaskAsync(task);
}
}
private async Task WatchTaskAsync(Task task) {
[...]
}
[...]
}
现在我想知道 - 如果我有一个像
WatchTaskAsync
这样的方法,我永远不想等待(not等待该任务本质上是整个课程的目的),那么在第一名?我知道await和discard之间的区别,但是在这个特定的上下文中,该方法仅在我不想等待其完成的情况下被调用,创建该async void
对象只是为了丢弃每次都没有意义,不是吗?
Task
称为
即发即忘。 启动
Task
fire-and-crash。 如果出现错误,就会出现差异。被解雇并被遗忘的
async void
的例外永远不会出现。它将永远处于雷达之下。
Task
操作的异常将在捕获的async void
上重新抛出,并且所有已知的
SynchronizationContext
会大声传播它们的异常,弹出消息框等。如果没有SynchronizationContext
,就像在控制台应用程序,异常在 SynchronizationContext
上重新引发,导致进程在错误后几毫秒崩溃。¹ 这听起来很糟糕,但可以说比其他选择更好。崩溃并显示错误消息比获得无响应的应用程序自发挂起而不提供任何反馈要好。