2015-04-20 2 views
1

В каком состоянии принципал теряется для текущего потока. У меня есть приложение Windows Form, которое использует основной для основного потока и получает уведомление через WCF с сервера. На некоторых клиентах я теряю Принципала для текущего потока, и я не понимаю, почему. «потерянным», кажется, из кода:.Net Thread.CurrentPrincipal

foreach (EventHandler subscriber in onApplicationIdle.GetInvocationList()) 
{ 
    subscriber.BeginInvoke(this, e, OnAsyncCompleted, subscriber); 
} 
+0

Можете ли вы опубликовать некоторый код, и в какой момент «CurrentPrincipal» «исчезает»? – Yura

+0

Я пытаюсь понять, почему потеряно. Код, который я вижу, является foreach (подписчик EventHandler в onApplicationIdle.GetInvocationList()) { абонент.BeginInvoke (это, e, OnAsyncCompleted, подписчик); } – ctescu

+3

Я имею в виду добавить больше информации о потоках приложений. Что-то вроде «Вызов службы WCF» -> Получить асинхронный отклик-> UpdateUI (здесь «CurrentPrincipal» равно null) ». Просто опубликуйте более широкий объем вашего кода. – Yura

ответ

4

При создании нового потока в .NET основной родительской нити автоматически не распространяются. Вы должны сделать это сами, если вы делаете нить.

Если вы используете async, я считаю, что у него есть свои правила распространения идентичности в любых создаваемых им потоках.

Вызов BeginInvoke ставит метод в ThreadPool (я верю!), Поэтому здесь применяются принципы пула потоков. Я думаю, это означает, что вы должны сделать это сами!

У вас может быть всякая нить. ВАМ необходимо установить принципала автоматически, вызывая AppDomain.SetPrincipalPolicy, но это охватывает только три типа в PrincipalPolicy enum.

В противном случае это зависит от вас в резьбовом коде, чтобы установить Thread.Current.Principal() вручную.

Пожалуйста, см. Сообщение о переполнении стека wrong-thread-currentprincipal-in-async-wcf-end-method для аналогичного обсуждения.

Смежные вопросы