2015-09-20 4 views
1

Я использую WindowsIdentity.Impersonate, чтобы читать из удаленного реестра. Тем не менее, фактический код, который является регистром чтения, находится в делегатах Task, поэтому он может работать на разных потоках. Мой вопрос заключается в том, является ли законным олицетворять в потоке пользовательского интерфейса и выполнять повышенную работу в пуле потоков?Windows Impersonation и TPL

UPDATE:

// get userHandle from LogonUser(...)  
Task task = Task.Run(() => 
{ 
    using (impersonationContext = WindowsIdentity.Impersonate(userHandle)) 
    { 
     // Do stuff here 
     if (impersonationContext != null) 
     { 
      impersonationContext.Undo(); 
     } 
    } 
} 
+0

Что вы подразумеваете под * законным *? –

+0

Я имею в виду, даже если он работает с моей первой попытки, в некоторых случаях это не подведет. Попытка понять, применяется ли олицетворение на текущем потоке или на всех потоках/процессах. – Pablo

ответ

2

Поскольку вы используете TPL, которые доступны с .NET Framework 4.0. WindowsIdentity должен автоматически течь, если только вы явно не подавите поток.

В .NET Framework версии 1.0 и 1.1 WindowsIdentity не распространяется на любые пользовательские асинхронные точки. В .NET Framework версии 2.0 существует объект ExecutionContext, который содержит информацию о текущем исполняемом потоке и передает его через асинхронные точки в домене приложения. WindowsIdentity также протекает как часть информации, которая проходит через асинхронные точки, а это означает, что при выходе из контекста олицетворения будет также протекать поток. Source