当我们在MVC中使用异步操作时,如下例所示,发布模型数据在10秒内可用(此处为1秒)?我很困惑,如何在1秒内获得数据在获取数据时需要10秒???
例如:
public async Task<ActionResult> GetPosts()
{
// ...
IPost posts = await PostService.GetPosts();// assume this take 10 seconds
// ...
return View(model: posts);//BUT we return in 1 second! How posts model available in view for show to the user earlier than 10 seconds?
}
答案 0 :(得分:7)
您无法在1秒内到达return
语句。一旦到达尚未完成的第一个Task<ActionResult>
表达式,该方法就会返回await
。在异步方法 到达return
语句之前,该任务将无法完成(因此无法获得结果)。
但是当你正在等待的第一件事完成时,你的异步方法将会恢复,从它停止的地方继续,直到下一次等待,它将再次“进入睡眠状态”(但不会阻塞一个线程)直到等待已经完成等等。
这就是异步的本质。您只需区分“异步方法已返回任务”(快速发生)和“异步方法已完成”(通常不会快速发生)。
很难在几个段落中彻底描述异步 - 我建议你阅读一本好书,观看视频或阅读一个好的教程。 MSDN是一个很好的起点。