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

标签 c# mvvm asynchronous windows-store-apps async-await

我想知道如果我在不使用 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/

相关文章:

c# - Nito.AsyncEx.AsyncLock 堆栈溢出,带有大量等待者和同步快速路径

c# - 禁用 ASP.net TreeView 复选框

c# - 在不使用用户 ID 和密码的情况下对 Azure SQL 数据库进行身份验证

c# - Windows Phone 构建应用程序教程

Android - MVVM 中 ViewModel 状态的最佳实践?

wpf - 如何将 DataContext 绑定(bind)到窗口资源中的 ViewModel 对象

c# - 如何使用 JSON 从 WCF REST 服务返回 Base64 编码的字节数组?

c# - 使用WPF MVM在ViewModel中访问XAML元素并在运行时应用动态样式

multithreading - WP7 - 访问 UI 线程?

javascript - 在 <script> 标签之间执行的异步代码