2012-05-19 23 views

Respuesta

30

Task.Factory.Start se disparará una nueva Thread y porque el HttpContext.Context es local a un hilo que no será automaticamente copia en la nueva Thread, por lo que necesita para pasar a mano:

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

curiosamente, eso funciona extraño para mí. Por ejemplo, la propiedad de usuario de HttpContext se vuelve nula después de ingresar el hilo, aunque tenía valor en HttpContext.Current. – Giedrius

+2

Sí, vale la pena señalar que el uso de una referencia a HttpContext.Current podría funcionar muchas veces, pero no se recomienda y es probable que falle a veces. El tiempo de ejecución de ASP puede limpiar el objeto cuando se realiza la solicitud http y luego encontrará cosas como 'context.Items [x]' que no contiene lo que puso allí antes. Ver también http://stackoverflow.com/questions/8925227/access-httpcontext-current-from-threads – Rory

8

Usted podría utilizar un cierre para tenerlo disponible en el hilo de nueva creación:

var currentContext = HttpContext.Current; 

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

Pero hay que tener en cuenta que una tarea puede sobrevivir a la vida útil de la petición HTTP y podría conducir a resultados divertidos cuando se accede a la HTT PContext después de que la solicitud se haya completado.

+0

Me gusta usar esta forma en lugar de pasar un objeto de estado y convertir los elementos en variables individuales ... desordenadas. –

0

Como David señaló, HttpContext.Current no va a funcionar todo el tiempo. En mi caso, aproximadamente 1 de 20 veces, CurrentContext será nulo. Termina con abajo.

string UserName = Context.User.Identity.Name; 

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