我想知道如果我在不使用 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() 中等待的方法调用是否仍会像预期的那样工作。如您所见,setter 没有必要等待 Initialize(),因为没有返回值,而且这是属性的 setter 的最后一次调用。有点火了就忘了。
我想这样做的原因是我想结合 MVVM 和一个迫使我使用异步方法的数据后端。
在上面的示例中,用户从列表中选择一个条目,程序应在 View 的另一部分显示有关该条目的详细信息。
我想将列表中当前选定的条目绑定(bind)到 DataId,只要用户更改选择,它就会更新详细 View 。当然,可以从事件处理程序执行异步方法调用,但为了更清晰的 MVVM 实现(主要使用数据绑定(bind)),我想避免使用事件处理程序。
最佳答案
如果您在不等待任务的情况下调用async Task
方法,那么该方法的任何异常都将被静默忽略。如果您调用 async void
方法(您在问题标题中提到,但您的代码没有这样做),那么该方法的任何异常都将在SynchronizationContext
- 在本例中,直接发送到 UI 主循环。
我在 asynchronous properties. 上有一篇博文最后一节介绍了NotifyTaskCompletion
type ,专为异步数据绑定(bind)而设计。
关于c# - 在没有等待的情况下调用异步方法会发生什么?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/21860108/