【发布时间】:2018-08-22 22:34:52
【问题描述】:
我有一个简单的控制器,有两个方法 Index 和 IndexAsync 分别同步和异步。我尝试做与article 中所写相同的操作。但是出了点问题,我得到 12 而不是 5 秒的结果。怎么会,是什么原因?
public class HomeController : Controller
{
[HttpGet]
public ActionResult Index()
{
return View();
}
[HttpGet]
public async Task<string> IndexAsync()
{
Stopwatch stopwatch = new Stopwatch();
stopwatch.Start();
await Delay(3);
await Delay(5);
await Delay(4);
stopwatch.Stop();
return stopwatch.Elapsed.Seconds.ToString();
}
private async Task<Int32> Delay(int sec)
{
await Task.Delay(1000 * sec);
return sec;
}
}
结果:
【问题讨论】:
-
这必然会发生,因为您使用 await 一个接一个地进行异步调用,这将使其结果为 3 + 4 + 5 = 12 秒
-
你需要的是
Task.WhenAll,让它在5秒内完成 -
请注意,您链接到的代码单独调用了包含延迟的方法并然后
awaited 结果。跨度> -
@Damien_The_Unbeliever 我尝试遵循article 中使用的方法。你能解释一下,我的代码和文章代码有什么区别吗?
-
var contentTask = service.GetContentAsync();- 调用GetContentAsync并在此过程中返回。然后通过调用其他异步方法开始另外两个异步操作,并且只有在之后他们才写await contentTask。而您立即await每个异步方法调用。
标签: c# asp.net-mvc async-await