调用Async控制器方法并等待结果

时间:2015-02-24 12:30:12

标签: jquery asp.net-mvc asynchronous async-await

我有一个控制器方法,它可以执行很长时间的操作并且几乎以这种方式编码

[HttpPost]
[ValidateAntiForgeryToken]
public async Task<ActionResult> MyLongMethodAsync( MyViewModel model ) {
    if ( ModelState.IsValid ) {
        try {
            await _service.DoLongTaskAsync( model );
            return RedirectToAction( "LongTaskResult", new { id = model.TaskID } );
        }
        catch ( Exception e ) {
            HandleErrorViewModel he = new HandleErrorViewModel( e.Message );
            return View( "HandleError", he );
        }
    }
}

我在剃刀视图中从jQuery调用此方法。

在上一个时期,我注意到该方法将执行时间增加到超过5分钟,并希望更改方法的行为以支持不同的用法。 具体来说,我想立即返回启动到UI的任务通知,然后让UI监听任务完成事件。我想避免使用UI来轮询结果。还有其他方法可以处理这种情况吗?

1 个答案:

答案 0 :(得分:3)

服务器端的async-await用于此目的,不会浪费可以为其他请求提供服务的线程,而不是同步等待。

这不会改变客户端和服务器之间的交互。为此你需要另一个解决方案。我认为SignalR是目前首选的解决方案,因为它支持客户端(JS)和服务器(ASP.Net),但还有其他选项,例如XSockets。