c# - 不并行运行的异步方法

标签 c# asp.net .net asp.net-mvc asp.net-mvc-4

我试图了解 async/await,看看我是否需要在我的 ASP.NET MVC 5 应用程序中使用异步调用。

在用值填充我的 View 模型时,我有以下内容:

MyViewModel myViewModel = new MyViewModel();
myViewModel.Answer1 = await myService.CalculateAnswer1Async();
myViewModel.Answer2 = await myService.CalculateAnswer2Async();

以及上述两种方法背后的代码:

public async Task<int> CalculateAnswer1Async()
{
     await Task.Delay(5000);

     return 111;
}

public async Task<int> CalculateAnswer2Async()
{
     await Task.Delay(6000);

     return 222;
}

据我了解,上述 2 个方法将一个接一个地执行,首先是 CalculateAnswer1Async(),然后是 CalculateAnswer2Async()。因此,完成此操作所需的最长时间应该在 6 秒左右(CalculateAnswer2Async() 完成所需的时间)?但是当我运行页面时,加载大约需要 11 秒,即 5 秒 + 6 秒 = 11 秒。

有人可以帮我澄清一下我做错了什么吗?

最佳答案

当您await 时,您将暂停当前的async 方法,直到该操作完成。 线程 可以腾出时间去做其他工作,但是 方法 不会继续执行,直到 await 完成。我有一个 async intro在我的博客上更详细地描述了这一点。

如果你想同时做多个异步请求,那么你可以延迟await直到所有任务都开始。所以这是一个选择:

MyViewModel myViewModel = new MyViewModel();
var task1 = myService.CalculateAnswer1Async();
var task2 = myService.CalculateAnswer2Async();
myViewModel.Answer1 = await task1;
myViewModel.Answer2 = await task2;

使用 Task.WhenAll 稍微更有效(并且通常会产生更清晰/更清晰的代码):

MyViewModel myViewModel = new MyViewModel();
var task1 = myService.CalculateAnswer1Async();
var task2 = myService.CalculateAnswer2Async();
await Task.WhenAll(task1, task2);
myViewModel.Answer1 = await task1;
myViewModel.Answer2 = await task2;

如果所有操作都返回相同类型的值(int,在这种情况下),那么您可以通过使用 Task.WhenAll< 的结果来避免“虚假等待”/:

MyViewModel myViewModel = new MyViewModel();
var task1 = myService.CalculateAnswer1Async();
var task2 = myService.CalculateAnswer2Async();
var results = await Task.WhenAll(task1, task2);
myViewModel.Answer1 = results[0];
myViewModel.Answer2 = results[1];

关于c# - 不并行运行的异步方法,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/22401218/

相关文章:

c# - Entity Framework 中的 HierarchyID 不起作用

c# - 使用 --configuration 运行的 dotnet ef 导致 MSB4006

c# - 如何在 Bootstrap 中使用 RequiredFieldValidator 和 ValidationSummary

.net - .NET、NUnit 或 MSTest 的 TDD 新手

.net - 覆盖 WPF 模板时,是否必须分别覆盖每个主题的模板?

c# - ASP.NET : SqlDataSource insert - identity parameter

c# - 了解 C# 中 LINQ 中的惰性求值

c# - 求asp.net 3D曲面图

c# - Visual Studio 2008 中无法识别的标记前缀或设备筛选器

c# - 自定义错误页面在实时服务器上不起作用