当调用异步方法但不使用await时会发生什么?

5
我想知道如果我调用一个标记为async的方法却不使用await会发生什么。考虑以下示例:
private int id = 0;
async Task Initialize()
{
     var content = await LoadFromDisk(id);
     await Process(content);
     return;
}

DataId
{
    get { return id; }
    set { id = value; Initialize(); }
}

我知道这会产生一个编译警告,但我的问题是,如果在Initialize()方法中调用的awaited方法仍然能像预期的那样工作。正如你所看到的,setter方法不需要等待Initialize()方法,因为没有返回值,而且它是属性setter的最后一个调用。它有点像“火并忘”。

我要这样做的原因是我想结合MVVM和强制我使用异步方法的数据后端。

在上面的例子中,用户从列表中选择一个条目,程序应该在视图的另一部分显示有关该条目的详细信息。

我想将列表的当前选定条目绑定到DataId上,每当用户更改选择时,它就会更新详细视图。当然,可以从事件处理程序中进行异步方法调用,但为了实现更清晰的MVVM实现(主要使用数据绑定),我想避免使用事件处理程序。


我有点困惑,你谈论了没有awaitasync方法,但是你的Initialize()不是async的,但是它包含await,这样编译不会通过。 - svick
抱歉,我只是忘了加async关键字。我在文章中已经修复了它。 - SebastianR
1个回答

13
如果您调用一个未等待任务的`async Task`方法,那么该方法中的任何异常都将被静默忽略。如果您调用一个`async void`方法(这是您在问题标题中提到的,但您的代码并没有这样做),那么该方法中的任何异常将重新在`SynchronizationContext`上引发-在这种情况下,直接发送到UI主循环。
我在我的博客文章中介绍了异步属性。最后一节介绍了专门为异步数据绑定设计的NotifyTaskCompletion类型

谢谢!我想我会使用NotifyTaskCompletion - SebastianR

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接