2016-08-01 17 views
1

All UI-Ereignisse mitdie Current Set schlug fehl, wenn in Winform

ich ein Problem getroffen, als ich Thread.CurrentPrincipal auf einer WinForm Anwendung zu setzen versucht.

Es gibt zwei Schaltflächen auf Form, Button1 und Button2. Button1 setzt den Thread.CurrentPrincipal und Button2 zeigt den CurrentPrincipal. Bis jetzt läuft alles gut.

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()); 
} 

Dann habe ich einen Code geändert. Ich möchte den Principal einmal festlegen Form gezeigt.So habe ich ein Ereignis auf Form.Shown hinzugefügt.

Wenn ich auf den Button2 klicke, um das Prinzip zu zeigen, habe ich nichts gesehen.

Ich habe versucht, den Prinzipal auf den Konstruktor des Formulars festzulegen. Dann habe ich das Ergebnis erwartet, als ich auf Button2 geklickt habe.

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

Ich suchte auf Google, Inzwischen habe ich keine Ahnung davon. Was ist der Unterschied zwischen diesen beiden Wegen?

Vielen Dank.

+0

haben Sie SetPermissio testen() zu verwenden, ohne Dispatcher.CurrentDispatcher.Invoke (..) nennen? – Wolfgang

+0

Ja, dasselbe Ergebnis. Kann das Prinzip nicht bekommen. –

+0

Hm .. gibt es einen Fehler? welche? Oder wird der Handler oder SetPermision() nicht ausgeführt? Beachten Sie, dass das Shown-Ereignis nur einmal ausgelöst wird - beim ersten Anzeigen eines Formulars. – Wolfgang

Antwort

1

versuchen

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

statt

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

Vielen Dank, Wolfgang. Ich versuchte es. Eigentlich habe ich myPrinciples beim Klicken auf button2 gesehen, aber ich habe hier eine andere Frage: Warum kann ich mein Prinzipal nicht nach "AppDomain.CurrentDomain.SetThreadPrincipal (new MyPrinciple() {User =" xxxx "})" in der setPermission-Methode sehen. –

+0

Entschuldigung. Ich weiß es selbst nicht sicher: Ich denke, es hat etwas zu tun, wie System- und Anwendungsthreads synchronisiert werden. Ich habe mir eine meiner Lösungen angeschaut, wie ich es gemacht habe, weil ich das gleiche Problem schon oft hatte. – Wolfgang