我有一个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秒才能重定向。
你能指导我在这里缺少什么吗?
答案 0 :(得分:1)
但是当我点击页面中的任何链接时,它会等待整个操作完成(20秒),然后重定向到相应的URL。
异步控制器方法不会使HTTP交互异步,只是从Web服务器到Web应用程序异步的交互。我们的想法是,在长时间运行的请求正在执行其操作时,高容量Web服务器可以释放线程来为其他请求提供服务。
当您点击链接时,浏览器需要等待响应,然后处理该响应(显示页面)。如果没有等待从Web服务器发送该页面,就无法显示页面。