mvc异步等待链接点击等待任务完成

时间:2015-02-23 18:34:13

标签: asp.net-mvc async-await jsonresult

我有一个MVC网站,我试图用异步调用方法。我的代码如下:

视图

 <a href="#" class="submit-download" data-id="24589">Submit Download</a>

    $(document).on('click', '.submit-download', function (evt) {
        var submit_url = '/SubmitDownloads/24589; 

        $.ajax({
            type: 'POST',
            url: submit_url,
            success: function (data) {
                if (data.Item1)
                        location.reload();

            }
        });

    });

控制器

    [HttpPost]
    public async Task<JsonResult> SubmitDownloads(int id)
    {
        var respository = new WorkflowRepository();
        var result = await respository.SubmitAsync(id);
        return Json(result, JsonRequestBehavior.AllowGet);
    }

存储库方法

    //db service call which will take much longer time
    public async Task<Tuple<bool, string>> SubmitAsync(id)
    {
        //long running method here
         await Task.Delay(20000);
         return new Tuple<bool, string>(true, "done with " + id);

    }

当用户点击“提交下载”时,链接在视图中,它完成整个功能快速,因为它应该做和页面显示响应像可滚动,菜单显示正常。但是当我点击页面中的任何链接时,它会等待整个操作完成(20秒),然后重定向到相应的URL。

如果我将Task.Delay更改为50秒,则链接点击需要50秒才能重定向。

你能指导我在这里缺少什么吗?

1 个答案:

答案 0 :(得分:1)

  

但是当我点击页面中的任何链接时,它会等待整个操作完成(20秒),然后重定向到相应的URL。

异步控制器方法不会使HTTP交互异步,只是从Web服务器到Web应用程序异步的交互。我们的想法是,在长时间运行的请求正在执行其操作时,高容量Web服务器可以释放线程来为其他请求提供服务。

当您点击链接时,浏览器需要等待响应,然后处理该响应(显示页面)。如果没有等待从Web服务器发送该页面,就无法显示页面。