No, la identidad no se propagará automáticamente a estos subprocesos de trabajo. Si, de hecho, los componentes que está usando son HttpContext.User
, lo que puede hacer es capturar la instancia actual, "ambiente" HttpContext
en su subproceso "principal" y propagarla a sus subprocesos de trabajo. Eso sería algo como esto:
HttpContext currentHttpContext = HttpContext.Current;
myWorkItems.AsParallel().ForAll(wi =>
{
HttpContext.Current = currentHttpContext;
try
{
// anything called from here out will find/use the context of your original ASP.NET thread
}
finally
{
// Disassociate the context from the worker thread so that it is not held on to beyond its official lifetime
HttpContext.Current = null;
}
});
Esto funciona porque HttpContext.Current
está respaldado por un hilo estática, por lo que cada subproceso de trabajo se le asignará la instancia de su hilo principal y cualquier trabajo realizado sobre él desde ese punto veremos que como la instancia actual.
Ahora, debe tener en cuenta que HttpContext
y sus clases relacionadas no se diseñaron para ser seguras para subprocesos, por lo que se trata de un truco. Si solo lees de las propiedades, esto no es realmente un problema. Si no está usando componentes que se basan en HttpContext.Current
, entonces sería "más limpio" no configurar eso y en su lugar solo use la variable currentHttpContext
capturada directamente en el trabajador.
Por último, si todo lo que realmente necesita es propagar el director actual de los subprocesos de trabajo a continuación, puede hacer precisamente eso en lugar de utilizar el mismo enfoque:
Principal logicalPrincipal = Thread.CurrentPrincipal;
myWorkItems.AsParallel().ForAll(wi =>
{
Principal originalWorkerThreadPrincipal = Thread.CurrentPrincipal;
Thread.CurrentPrincipal = logicalPrincipal;
try
{
// anything called from here out will find the principal from your original thread
}
finally
{
// Revert to the original identity when work is complete
Thread.CurrentPrincipal = originalWorkerThreadPrincipal;
}
});
Vea si el campo de respaldo es '[ThreadStatic]', de lo contrario, debería estar bien. – leppie
@joeenzminger Vea aquí http://stackoverflow.com/a/13049286/50776 para una prueba que muestra que PLINQ fluye 'ExecutionContext' (y por lo tanto' Thread.CurrentPrincipal'). – casperOne