CSharp - 在控制器中,调用异步方法

  显示原文与译文双语对照的内容
0 0

我有一个控制器,类似下面的信息:

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

当调用控制卡收到下面的错误消息:

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

现在我没有控制权 CallSomeMethodWhichDoesAsyncOperations并且该方法本身不是异步但是在内部做一些异步即触即忘。 我该如何做才能解决? 试图更改控制器到 AsyncController和/ 或使方法在控制器async 。

编辑:

当我尝试使用未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);
    }
}

媒体却将异常改为下面的" 异步模块或处理程序已完成,但异步操作仍待定。"

时间:原作者:6个回答

0 0

现在我没有控制CallSomeMethodWhichDoesAsyncOperations和本身不是异步的方法但是在内部做一些异步即触即忘。 我该如何做才能解决?

人联系谁写的,使其中 修好的

说真的,这是最好的选择。 没有好是要修复这个hack 。

就可以修改其正常工作,如下所示:

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

建议不要这样做。 此解决方案推动下班到后台线程,因此当 async操作恢复,它们将不会有广告 HttpContext等。 这个解决方案就完成了请求的同时还有中进行处理。 此解决方案将无法正常运行如果服务器stopped/recycled在只是错误的时间。

只有一个正确的解决方案: 更改 CallSomeMethodWhichDoesAsyncOperations.

原作者:
...