No, l'identità non verrà propagata automaticamente a questi thread di lavoro. Se, infatti, i componenti che stai utilizzando sono HttpContext.User
, ciò che puoi fare è catturare l'istanza "ambiente" corrente "HttpContext
" nel tuo thread "principale" e propagarla ai tuoi thread di lavoro. Che qualcosa sarebbe simile a questa:
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;
}
});
Questo funziona perché HttpContext.Current
è sostenuta da un filo statico, così ogni thread di lavoro verrà assegnato l'istanza dal thread principale e qualsiasi lavoro svolto su di esso da quel punto vedrà che come l'istanza corrente.
Ora, è necessario essere consapevoli del fatto che HttpContext
e le relative classi non sono state progettate per essere thread-safe, quindi questo è un po 'un hack. Se stai leggendo solo da proprietà questo non è davvero un problema. Se non si utilizzano componenti che si basano su HttpContext.Current
, sarebbe "più pulito" non impostarlo e utilizzare semplicemente la variabile acquisita currentHttpContext
direttamente nell'operatore.
Infine, se tutto ciò che realmente serve è quello di propagare la principale corrente per i thread di lavoro, allora si può fare proprio questo, invece utilizzando lo stesso approccio:
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;
}
});
fonte
2011-12-04 20:38:39
Vedere se il campo supporto è '[ThreadStatic]', se non, allora si dovrebbe essere ok. – leppie
@joeenzminger Vedi qui http://stackoverflow.com/a/13049286/50776 per un test che mostra che PLINQ scorre 'ExecutionContext' (e quindi' Thread.CurrentPrincipal'). – casperOne