Нет, идентификатор не будет автоматически распространяться на эти рабочие потоки.Если, на самом деле, вы используете HttpContext.User
компоненты, которые вы можете сделать, это захватить текущий «окружающий» HttpContext
экземпляр в вашем «основном» потоке и распространить его на ваши рабочие потоки.Это выглядело бы примерно так:
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;
}
});
Это работает, потому что HttpContext.Current
поддерживается статическим потоком, поэтому каждому рабочему потоку будет назначен экземпляр из вашего основного потока, а любая работа, выполненная с ним, -Точка увидит, что в качестве текущего экземпляра.
Теперь вы должны знать, что HttpContext
и связанные с ним классы не были спроектированы как поточно-ориентированные, так что это немного хакерство.Если вы читаете только из свойств, это не проблема.Если вы не используете компоненты, которые полагаются на HttpContext.Current
, то было бы «чище» не устанавливать это, а вместо этого просто использовать захваченную переменную currentHttpContext
непосредственно в рабочем.
Наконец, если все, что вы на самом деленеобходимо распространить текущий принципал на рабочие потоки, тогда вы можете сделать это вместо этого, используя тот же подход:
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;
}
});