quiero acceder HttpContext.Current en mi aplicación asp.net dentro¿Cómo accedo a HttpContext.Current en Task.Factory.StartNew?
Task.Factory.Start(() =>{
//HttpContext.Current is null here
});
¿Cómo puedo solucionar este error?
quiero acceder HttpContext.Current en mi aplicación asp.net dentro¿Cómo accedo a HttpContext.Current en Task.Factory.StartNew?
Task.Factory.Start(() =>{
//HttpContext.Current is null here
});
¿Cómo puedo solucionar este error?
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);
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.
Me gusta usar esta forma en lugar de pasar un objeto de estado y convertir los elementos en variables individuales ... desordenadas. –
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 ...
}
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
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