我有一个标准的非异步操作,例如:
[HttpPost]
public JsonResult StartGeneratePdf(int id)
{
PdfGenerator.Current.GenerateAsync(id);
return Json(null);
}
我的想法是我知道这个 PDF 生成可能需要很长时间,所以我只是开始任务并返回,而不关心异步操作的结果。
在默认的 ASP.Net MVC 4 应用程序中,这给了我一个很好的例外:
System.InvalidOperationException:此时无法启动异步操作。异步操作只能在异步处理程序或模块内或在页面生命周期中的某些事件期间启动。如果在执行页面时发生此异常,请确保将页面标记为 <%@ Page Async="true" %>。
这与我的场景无关。调查它,我可以将标志设置为 false 以防止此异常:
<appSettings>
<!-- Allows throwaway async operations from MVC Controller actions -->
<add key="aspnet:AllowAsyncDuringSyncStages" value="true" />
</appSettings>
https://stackoverflow.com/a/15230973/176877
http://msdn.microsoft.com/en-us/library/hh975440.aspx
但问题是,启动此异步操作并从同步 MVC 控制器操作中忘记它有什么害处吗?我能找到的所有东西都建议让控制器异步,但这不是我想要的——没有意义,因为它应该总是立即返回。