始终丢弃返回的任务和使方法异步无效之间有区别吗?

问题描述 投票:0回答:1

我试图创建一个视图模型,其中一些属性是从后台线程加载的。

对于此任务,我在 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对象只是为了丢弃每次都没有意义,不是吗?

    

c# async-await
1个回答
3
投票
Task

称为

即发即忘
启动 Task
操作称为
fire-and-crash
如果出现错误,就会出现差异。被解雇并被遗忘的

async void

的例外永远不会出现。它将永远处于雷达之下。

Task
操作的异常将在捕获的
async void
上重新抛出,并且所有已知的
SynchronizationContext
会大声传播它们的异常,弹出消息框等。如果没有
SynchronizationContext
,就像在控制台应用程序,异常在
SynchronizationContext
 上重新引发,导致进程在错误后几毫秒崩溃。
¹

这听起来很糟糕,但可以说比其他选择更好。崩溃并显示错误消息比获得无响应的应用程序自发挂起而不提供任何反馈要好。

© www.soinside.com 2019 - 2024. All rights reserved.