21

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

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

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

4

3 に答える 3

36

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

var task = Task.Factory.StartNew(
    state =>
        {
            var context = (HttpContext) state;
            //use context
        },
    HttpContext.Current);
于 2012-05-19T05:09:20.140 に答える
8

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

var currentContext = HttpContext.Current;

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

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

于 2012-05-19T09:05:40.033 に答える
0

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

string UserName = Context.User.Identity.Name;

System.Threading.Tasks.Task.Factory.StartNew(() =>
{
    UserName ...
}
于 2016-09-28T14:00:47.593 に答える