我有一个控制器方法,它可以执行很长时间的操作并且几乎以这种方式编码
[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来轮询结果。还有其他方法可以处理这种情况吗?
答案 0 :(得分:3)
服务器端的async-await
用于此目的,不会浪费可以为其他请求提供服务的线程,而不是同步等待。
这不会改变客户端和服务器之间的交互。为此你需要另一个解决方案。我认为SignalR是目前首选的解决方案,因为它支持客户端(JS)和服务器(ASP.Net),但还有其他选项,例如XSockets。