我试图了解 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/