web-dev-qa-db-ja.com

Task.Factory.StartNewでHttpContext.Currentにアクセスするにはどうすればよいですか?

内のasp.netアプリケーションでHttpContext.Currentにアクセスしたい

Task.Factory.Start(() =>{
    //HttpContext.Current is null here
});

このエラーを修正するにはどうすればよいですか?

20
Tim Tom

Task.Factory.Startは新しいThreadを起動しますが、これはHttpContext.Contextはスレッドに対してローカルであり、新しいThreadに自動的にコピーされないため、手動で渡す必要があります。

var task = Task.Factory.StartNew(
    state =>
        {
            var context = (HttpContext) state;
            //use context
        },
    HttpContext.Current);
34
nemesv

クロージャを使用して、新しく作成されたスレッドで使用できるようにすることができます。

var currentContext = HttpContext.Current;

Task.Factory.Start(() => {
    // currentContext is not null here
});

ただし、タスクはHTTPリクエストの存続期間を超える可能性があり、リクエストの完了後にHTTPContextにアクセスすると、おかしな結果が生じる可能性があることに注意してください。

8
David Tischler

David が指摘しているように、HttpContext.Currentは常に機能するとは限りません。私の場合、20回のうち約1回、CurrentContextはnullになります。以下で終わります。

string UserName = Context.User.Identity.Name;

System.Threading.Tasks.Task.Factory.StartNew(() =>
{
    UserName ...
}
0
Rm558