2016-08-01 1 views
1

ВсеУстановите CurrentPrincipal сбой при использовании события UI В Winform

я встретил вопрос, когда я пытаюсь установить Thread.CurrentPrincipal на WinForm применения.

На Форме, Button1 и Button2 есть две кнопки. Button1 установите Thread.CurrentPrincipal и Button2, чтобы показать CurrentPrincipal. Пока все работает хорошо.

private void button1_Click(object sender, EventArgs e) 
{ 
     SetPermission(); 
} 

private void SetPermission() 
{ 
     Thread.CurrentPrincipal = new MyPrinciple() { User = "xxxx" }; 
} 

private void button2_Click(object sender, EventArgs e) 
{ 
     Console.WriteLine("Tread principal:{0},{1}", Thread.CurrentThread.Name, Thread.CurrentPrincipal.ToString()); 
} 

Затем я изменил код. Я хочу, чтобы авто устанавливал основную фигуру после показанной формы. Итак, я добавил событие в Form.Shown.

void Form1_Shown(object sender, EventArgs e) 
{ 
     Dispatcher.CurrentDispatcher.Invoke(new Action(() => { SetPermission(); })); 
} 

public Form1() 
{ 
     InitializeComponent(); 
     this.Shown += Form1_Shown; 
} 

Когда я нажимаю кнопку2, чтобы показать принца, я ничего не видел.

Я попытался установить принципал в конструкторе формы. Затем я получил ожидаемый результат, когда я нажал кнопку2.

public Form1() 
{ 
     InitializeComponent(); 
     //this.Shown += Form1_Shown; 
     SetPermission(); 
} 

Я искал в Google. К настоящему моменту я понятия не имею об этом. В чем разница между этими двумя способами?

Спасибо вам большое.

+0

вы испытать вызывать SetPermissio() без Dispatcher.CurrentDispatcher.Invoke (..)? – Wolfgang

+0

Да, тот же результат. Не могу получить Принцип. –

+0

Хм .. есть ли ошибка? который? Или не выполняется выполнение обработчика или SetPermisiion()? PLease сообщит, что событие Shown отправляется только один раз - первый раз, когда отображается форма. – Wolfgang

ответ

1

пытаются использовать

AppDomain.CurrentDomain.SetThreadPrincipal(new MyPrinciple() { User = "xxxx" }) 

вместо

Thread.CurrentPrincipal = new MyPrinciple() { User = "xxxx" }; 
+0

Большое спасибо, Wolfgang. Я попробовал. Фактически, я видел myPrinciple при нажатии кнопки2, но у меня есть еще один вопрос: почему я не вижу своего принципала после «AppDomain.CurrentDomain.SetThreadPrincipal (новый MyPrinciple() {User =« xxxx »}) в методе setPermission. –

+0

Извините. Я не знаю точно: я думаю, что это связано с тем, как синхронизация системных и прикладных потоков. Я посмотрел на одно из своих решений, как я это сделал, потому что у меня была одна и та же проблема. – Wolfgang

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