26

私は次のようなコントローラーを持っています:

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

コントローラを呼び出すと、次のエラーが発生します。

現在、非同期操作を開始することはできません。非同期操作は、非同期ハンドラーまたはモジュール内で、またはページライフサイクルの特定のイベント中にのみ開始できます。ページの実行中にこの例外が発生した場合は、ページにマークが付いていることを確認してください<%@ 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を制御できず、メソッド自体は非同期ではありませんが、内部的に非同期の起動を行い、忘れてしまいます。それを修正するにはどうすればよいですか?

それを書いた人に連絡して、彼らにそれを直してもらいます。

真剣に、それは最良の選択肢です。これに対する良い修正はありません-ハックだけです。

あなたはそれをハックしてこのように働くことができます:

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

これはお勧めしません。このソリューションは、作業をバックグラウンドスレッドにプッシュするため、async操作が再開されても、などはありませんHttpContext。このソリューションは、まだ処理が行われている間に要求を完了します。サーバーが間違ったタイミングで停止/リサイクルされた場合、このソリューションは正しく動作しません。

適切な解決策は1つだけです:変更CallSomeMethodWhichDoesAsyncOperations

于 2012-11-30T15:24:13.113 に答える