26

我有一个类似于以下内容的控制器:

public MyController : Controller
{
    public ActionResult DoSomething()
    {
        CallSomeMethodWhichDoesAsyncOperations();
        return Json(new { success = successful }, JsonRequestBehavior.AllowGet);
    }
}

调用我的控制器时,出现以下错误:

此时无法启动异步操作。异步操作只能在异步处理程序或模块内或在页面生命周期中的某些事件期间启动。如果在执行 Page 时发生此异常,请确保将 Page 标记为<%@ Page Async="true" %>

现在我无法控制CallSomeMethodWhichDoesAsyncOperations并且方法本身不是异步的,但在内部会执行一些异步触发并忘记。我能做些什么来修复它?已尝试将控制器更改为AsyncController和/或使控制器中的方法异步。

编辑:

当我尝试使用我第一次尝试的 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);
    }
}

这确实将异常更改为以下“异步模块或处理程序已完成,而异步操作仍处于挂起状态”。

4

1 回答 1

26

现在我无法控制 CallSomeMethodWhichDoesAsyncOperations 并且方法本身不是异步的,但在内部会执行一些异步触发并忘记。我能做些什么来修复它?

联系编写它的人并让他们修复它。

说真的,这是最好的选择。对此没有很好的解决方法 - 只有一个 hack。

你可以破解它像这样工作:

public MyController : Controller
{
  public async Task<ActionResult> DoSomething()
  {
    await Task.Run(() => CallSomeMethodWhichDoesAsyncOperations());
    return Json(new { success = successful }, JsonRequestBehavior.AllowGet);
  }
}

不建议这样做。此解决方案将工作推到后台线程,因此当async操作恢复时,它们将没有HttpContext等。此解决方案在仍有待处理的情况下完成请求。如果服务器在错误的时间停止/回收,此解决方案将无法正常运行。

只有一个合适的解决方案:改变CallSomeMethodWhichDoesAsyncOperations

于 2012-11-30T15:24:13.113 回答