早期访问ASP.NET MVC中的异步操作结果

use*_*508 1 c# asp.net asp.net-mvc async-await asp.net-mvc-5

当我们在MVC中使用async动作时,如下例所示,post model模型数据可以在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?
    }
Run Code Online (Sandbox Code Playgroud)

Jon*_*eet 7

你没有return在1秒内完成声明.该方法一Task<ActionResult>到达第一个await尚未完成的表达式就返回a .这项任务将无法完成(所以你不能得到它的结果),直到您的异步方法确实达到return声明.

但是当你正在等待的第一件事完成时,你的异步方法将继续,从它停止的地方继续,直到下一个等待,它将再次"进入睡眠状态"(但不会阻塞一个线程),直到等待完成为止,等等

这就是异步的本质.您只需要区分"异步方法已返回任务"(快速发生)和"异步方法已完成"(通常不会很快发生).

在几个段落中很难彻底描述异步 - 我建议你阅读一本好书,观看视频或阅读一本好的教程.MSDN是一个很好的起点.