Как получить доступ к HttpContext.Current в Task.Factory.StartNew?

Я хочу получить доступ к HttpContext.Current в моем приложении asp.net в

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

Как я могу исправить эту ошибку?

Ответы

Ответ 1

Task.Factory.Start запустит новый Thread, и поскольку HttpContext.Context является локальным для потока, он не будет автоматически скопирован в новый Thread, поэтому вам нужно передать его вручную:

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

Ответ 2

Вы можете использовать закрытие, чтобы оно было доступно во вновь созданном потоке:

var currentContext = HttpContext.Current;

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

Но имейте в виду, что задача может пережить время жизни HTTP-запроса и может привести к забавным результатам при доступе к HTTPContext после завершения запроса.

Ответ 3

Как David указал, что HttpContext.Current не будет работать все время. В моем случае, около 1 из 20 раз, CurrentContext будет null. Завершите работу ниже.

string UserName = Context.User.Identity.Name;

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