2012-05-19 1 views

ответ

30

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

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

Интересно, что это действительно странно для меня. Например, свойство пользователя HttpContext становится нулевым после ввода потока, хотя оно имеет значение в HttpContext.Current. – Giedrius

+2

Да, стоит отметить, что использование ссылки на HttpContext.Current может работать много времени, но это не рекомендуется, и иногда это может быть неудачно. Время выполнения ASP может очистить объект, когда HTTP-запрос будет выполнен, и затем вы найдете такие вещи, как 'context.Items [x]' не содержит того, что вы положили туда раньше. См. Также http://stackoverflow.com/questions/8925227/access-httpcontext-current-from-threads – Rory

8

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

var currentContext = HttpContext.Current; 

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

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

+0

Мне нравится использовать этот способ вместо того, чтобы передавать объект состояния и выделять элементы в отдельные переменные ... messy. –

0

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

string UserName = Context.User.Identity.Name; 

System.Threading.Tasks.Task.Factory.StartNew(() => 
{ 
    UserName ... 
} 
Смежные вопросы