【发布时间】:2018-06-08 19:32:07
【问题描述】:
我有一个从数据库中获取数据的异步方法:
private async Task getDataAsync()
{
await getDataFromDatabaseAsync();
}
我有一个使用这种方法的构造器,以这种方式:
public MyViewModel()
{
Task.WhenAll(getDataAsync());
//getDataAsync().ConfigureAwait(false);
//next line of code
}
避免应用程序不被阻止的唯一方法是使用两个选项之一,这两个选项似乎都可以正常工作。我可以使用WhenAll,也可以使用ConfigureAwait(false)。
另一个选项是在任务中调用 getDataASync() 方法,但我想这是一个更糟糕的选项,因为它需要更多资源。
所以我想知道WhenAll和ConfigureAwait之间的区别。
当我以这种方式使用WhenAll时,“下一行代码”这行代码是在异步方法完成之后运行还是在完成之前运行?
谢谢。
【问题讨论】:
-
看起来你只是想绕开你不能在构造函数中调用异步代码的事实。最好不要这样做并重新编写代码。
-
Task.WhenAll() 将运行所有传递的任务以完成。任务完成后,ConfigureAwait(false) 不会与同步上下文同步。
-
ConfigureAwait是关于同步上下文的,与“阻塞”无关。您在这里将异步编程与并行执行混合在一起。这不是一回事。Task.WhenAll接受一些任务并让它们运行只要它需要并在所有完成后返回。await的行为与一项任务类似,ConfigureAwait只是告诉它使用哪个上下文。 -
这是在 STA 中运行的吗?例如WPF 调度程序?
标签: c# async-await