我有一个控制器,其内容如下:
public MyController : Controller
{
public ActionResult DoSomething()
{
CallSomeMethodWhichDoesAsyncOperations();
return Json(new { success = successful }, JsonRequestBehavior.AllowGet);
}
}
当调用我的控制器时,我收到以下错误:
此时无法启动异步操作。异步操作
只能在异步处理程序或模块内启动,或者在某些特定期间启动
页面生命周期中的事件。如果在执行Page时发生此异常,
确保页面已标记<%@ Page Async="true" %>
.
现在我无法控制CallSomeMethodWhichDoesAsyncOperations
并且该方法本身不是异步的,但在内部执行一些异步触发并忘记。我可以做什么来修复它?已尝试将控制器更改为AsyncController
和/或使控制器中的方法异步。
Edit:
当我尝试使用 AsyncController 时,我第一次尝试,结果相同
public MyController : AsyncController
{
public ActionResult DoSomething()
{
CallSomeMethodWhichDoesAsyncOperations();
return Json(new { success = successful }, JsonRequestBehavior.AllowGet);
}
}
进而
public MyController : AsyncController
{
public async Task<ActionResult> DoSomething()
{
CallSomeMethodWhichDoesAsyncOperations();
return Json(new { success = successful }, JsonRequestBehavior.AllowGet);
}
}
这确实将异常更改为以下“异步模块或处理程序已完成,而异步操作仍处于挂起状态”。
现在我无法控制 CallSomeMethodWhichDoesAsyncOperations 并且该方法本身不是异步的,但在内部执行了一些异步触发并忘记。我可以做什么来修复它?
联系写它的人并制作them fix it.
说真的,这是最好的选择。对此没有好的解决办法——只有一个 hack。
你可以像这样破解它:
public MyController : Controller
{
public async Task<ActionResult> DoSomething()
{
await Task.Run(() => CallSomeMethodWhichDoesAsyncOperations());
return Json(new { success = successful }, JsonRequestBehavior.AllowGet);
}
}
不建议这样做。该解决方案将工作推送到后台线程,因此当async
恢复运营后,他们将不会有HttpContext
等。此解决方案完成请求,同时仍有处理要做。如果服务器在错误的时间停止/回收,此解决方案将无法正常运行。
正确的解决办法只有一个:改变CallSomeMethodWhichDoesAsyncOperations
.
本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)