2016-08-01 4 views
1

すべてWinformでUIイベントを使用するとCurrentPrincipalが失敗しました。

WinFormアプリケーションでThread.CurrentPrincipalを設定しようとすると問題が発生しました。

フォームにButton1とButton2という2つのボタンがあります。 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.Showでイベントを追加しました。

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

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

私がprincpalを表示するためにbutton2をクリックすると、私は何も見ませんでした。

フォームのコンストラクタにプリンシパルを設定しようとしました。それから私はbutton2をクリックしたときに結果が期待されます。

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

Googleで検索しましたが、今は分かりません。これら2つの方法の違いは何ですか?

ありがとうございました。

+0

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

を使用しようと、あなたはDispatcher.CurrentDispatcher.Invoke(..)せずにSetPermissio()を呼び出してテストしましたか? – Wolfgang

+0

はい、同じ結果です。原則を得ることができません。 –

+0

何かエラーがありますか?それは?または、ハンドラまたはSetPermisiion()が実行されませんか?表示されたイベントは、フォームが表示された最初の1回のみディスパッチされます。 – Wolfgang

答えて

1

代わり

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

ありがとう、Wolfgang。私はそれを試してみました。実際、私はbutton2をクリックしたときにmyPrincipleを見ましたが、別の質問があります。理由は、setPermissionメソッドで "AppDomain.CurrentDomain.SetThreadPrincipal(new MyPrinciple(){User =" xxxx "}) –

+0

申し訳ありません。私は確かに自分自身を知らない:それはシステムとアプリケーションのスレッドが同期する方法に何かを持っていると思う。私は私の解決策の1つを見ました。なぜなら、私は同じ問題が1度は発生したからです。 – Wolfgang

関連する問題