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

Call an Async controller method and wait for result

我有一个控制器方法,它执行很长的操作并且几乎是这样编码的

[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 分钟以上,并希望更改该方法的行为以支持不同的用法。 具体来说,我想 return 立即向 UI 发送任务开始通知,然后让 UI 监听任务完成事件。我想避免让 UI 轮询结果。还有其他方法可以处理这种情况吗?

服务器端的 async-await 服务于它的目的是不浪费可以服务于其他请求而不是同步等待的线程。

这不会改变客户端和服务器之间的交互。为此,您需要另一种解决方案。我相信 SignalR 是当今首选的解决方案,因为它内置了对客户端 (JS) 和服务器 (ASP.Net) 的支持,但还有其他选项,例如 XSockets。