在没有等待的情况下调用异步方法会发生什么?

Seb*_*anR 5 c# asynchronous mvvm async-await windows-store-apps

我想知道如果我在没有使用await的情况下调用标记为async的方法会发生什么.考虑这个例子:

private int id = 0;
async Task Initialize()
{
     var content = await LoadFromDisk(id);
     await Process(content);
     return;
}

DataId
{
    get { return id; }
    set { id = value; Initialize(); }
}
Run Code Online (Sandbox Code Playgroud)

我知道这会产生一个编译警告,但我的问题是,如果在Initialize()中等待的方法调用仍然可以像预期的那样工作.正如您所看到的那样,setter不需要等待Initialize(),因为没有返回值,它是属性的setter的最后一次调用.这是一种火,忘了.

我想这样做的原因是我想将MVVM和数据后端结合起来,迫使我使用异步方法.

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

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

Ste*_*ary 13

如果在async Task不等待任务的情况下调用方法,则将以静默方式忽略该方法的任何异常.如果你调用一个async void方法(你在问题标题中提到,但你的代码没有这样做),那么该方法的任何异常都将重新引发SynchronizationContext- 在这种情况下,直接发送到UI主循环.

我有关于异步属性的博客文章.最后一节介绍了专门为异步数据绑定设计的NotifyTaskCompletion类型.