Как получить доступ к 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 ...
}