次のコード例は、ASP.NET MVCアプリケーションで使用されています。 このコードの目的は、長時間実行されている操作をキューに入れるための「fire and forget」要求を作成することです。ASP.NET HttpContext.Current Task.Run内
public JsonResult SomeAction() {
HttpContext ctx = HttpContext.Current;
Task.Run(() => {
HttpContext.Current = ctx;
//Other long running code here.
});
return Json("{ 'status': 'Work Queued' }");
}
私は、これは非同期コードでHttpContext.Currentを処理するための良い方法ではありません知っているが、現在、私たちの実装では、私たちは何かを行うことができますありません。私はこのコードは危険ですどれだけ理解したいと思い ...
質問:はTask.Run内部のHttpContextは、コンテキストに完全に別の要求を設定します設定することは理論的には可能ですか?
私はそう思いますが、わかりません。私はそれを理解する: Request1はスレッドプールからThread1で処理され、Thread1は絶対に別の要求(Request2)を処理している間、Task.Run内のコードはRequest1からRequest2へコンテキストを設定します。
私は間違っているかもしれませんが、ASP.NETの内部知識は私には正しく理解できません。
ありがとうございます!
HttpContext全体を渡すのではなく、必要なHttpContextから情報を取得する方が簡単ではないですか? (これはあなたの質問に答えることはできませんが、私はContext全体の必要性について興味があります)。 – vcsjones
これは正しい方法ですが、残念ながら現在は変更できません。私たちのコードはHttpContextにアクセスしています。現在のビジネスロジックの真中にあり、それを変更することは、現在のところ我々にはない大きな努力です。 –
あなたの質問には関係ありません。ウェブコンテキストで長時間実行されているタスクは素晴らしい考えではありません。サーバーは再起動でき、プール内には非常に多くのスレッドしかありません。あなたはHangFireやQuartzのようなものを考えましたか? –