【问题标题】:Early Access to Async Action Results in ASP.NET MVC提前访问 ASP.NET MVC 中的异步操作结果
【发布时间】:2014-03-23 23:54:08
【问题描述】:

当我们在 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?
    }

【问题讨论】:

    标签: c# asp.net asp.net-mvc async-await asp.net-mvc-5


    【解决方案1】:

    您不会在 1 秒内到达 return 语句。该方法在到达第一个尚未完成的await 表达式时立即返回Task&lt;ActionResult&gt;。在您的异步方法确实到达return 语句之前,该任务不会完成(因此您无法获得其结果)。

    但是当您等待的第一件事完成时,您的异步方法将恢复,从它停止的地方继续直到下一次等待,届时它将再次“进入睡眠”(但不会阻塞线程)直到可等待已完成等。

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

    很难用几段话来彻底描述异步 - 我建议您阅读一本好书、观看一段视频或阅读一本好教程。 MSDN 是一个很好的起点。

    【讨论】:

    • 你说“但没有阻塞线程”,所以请求没有阻塞当前线程,我们达到在 1 秒内返回,这是真的吗?如果您的回答是否定的,那么异步操作和非异步操作有什么区别?
    • @user197508:它返回给调用者——但 ASP.NET 在任务完成之前不会给 client 一个结果。不同之处在于,它在等待数据时并没有占用线程 - 因此,如果您有 10,000 个请求同时执行,您仍然可以使用很少的线程。
    • @Jun:所以异步操作的好处是,当我们在生产中使用有很多用户的项目时,在第二个用户有很多请求时,当另一个用户有请求时,这会导致用户没有被阻止?而且我们在开发中没有触及异步操作的好处?这是真的吗?
    • @user197508:这不是阻塞用户的问题——而是一次需要多少线程的问题。但是不,您也会在开发中使用异步 - 在部署到生产之前尝试从同步更改为异步会很糟糕。
    • @Jun:非常感谢您的关注。异步操作方法在操作必须执行“几个独立”长时间运行的操作时很有用,并且我们不能使用只有“一个”长时间运行的异步好处操作,就像我的问题示例。这是真的吗?
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2013-02-13
    • 2017-05-30
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多