1

リクエストがコントローラによって処理され、レスポンスがクライアントに返された後に実行する必要があるタスクがあります。そのために、コントローラーのイベントをオーバーライドし、OnActionExecuted()このメソッド内でタスクを呼び出しました。

OnActionExecuted()タスクの実行には時間がかかり、void も返されるため、オーバーライドされたメソッドがすぐに戻り、タスクの実行中にクライアントに応答を送信できるように、タスクを非同期で呼び出したいと考えています。Task.Run()(.net 4.5で)を使用して、以下のコードでこれを実装しようとしました

protected override void OnActionExecuted(ActionExecutedContext filterContext)
{
    Task.Run(() => WrapUp());
}

ただし、これでは目的の効果が得られません。コードをステップ実行すると、引き続き同期的に実行されます。メソッド内のすべてが、WrapUp()メソッドが終了する前に呼び出されOnActionExecuted()ます。WrapUp()メソッドがハングすると、クライアントは応答を受信する前にタスクの完了を待機したままになります。

これを意図したとおりに機能させるにはどうすればよいですか?

4

1 に答える 1

3

OnActionExecuted内部ではタスクを作成して開始しているだけなので、 はすぐに戻ります。あなたが観察している行動は正常ではありません。次のことを試してみるとどうなりますか。

protected override void OnActionExecuted(ActionExecutedContext filterContext)
{
    Task.Run(() => Thread.Sleep(10000));
}

クライアントは結果を得るために 10 秒も待っていませんよね?

于 2013-02-27T12:12:22.313 に答える