2010-11-15 3 views
12
in WPF benötigen

Mein Szenario:Der rufende Thread muss STA sein, weil viele UI-Komponenten dieses

void Installer1_AfterInstall(object sender, InstallEventArgs e) 
    { 
     try 
     {   

       MainWindow ObjMain = new MainWindow();    
       ObjMain.Show();    
     } 
     catch (Exception ex) 
     { 
      Log.Write(ex); 
     } 
    } 

Ich habe Fehler "Der aufrufende Thread STA sein muss, weil viele UI-Komponenten dieses erfordern"

was ich mache?

Antwort

24

Normalerweise hat die Einstiegspunktmethode für Threads für WPF [STAThreadAttribute] für ThreadMethod festgelegt, oder der Appliance-Status muss auf STA festgelegt werden, wenn der Thread unter Thread.SetApartmentState() erstellt wird. Dies kann jedoch nur eingestellt werden, bevor der Thread gestartet wird.

Wenn Sie nicht dieses Attribut auf den Eintrittspunkt der Anwendung des Threads gelten Sie diese Aufgabe aus ausführen, versuchen Sie Folgendes:

void Installer1_AfterInstall(object sender, InstallEventArgs e) 
{ 
    var thread = new Thread(new ThreadStart(DisplayFormThread)); 

    thread.SetApartmentState(ApartmentState.STA); 
    thread.Start(); 
    thread.Join(); 
} 

private void DisplayFormThread() 
{ 
    try 
    { 
     MainWindow ObjMain = new MainWindow(); 
     ObjMain.Show(); 
     ObjMain.Closed += (s, e) => System.Windows.Threading.Dispatcher.ExitAllFrames(); 

     System.Windows.Threading.Dispatcher.Run(); 
    } 
    catch (Exception ex) 
    { 
     Log.Write(ex); 
    } 
} 
+1

[STAThreadAttribute] private void DisplayFormThread anzeigen() { versuchen { Mainwindow ObjMain = new Mainwindow(); ObjMain.Show(); } catch (Ausnahme ex) { Log.Write (ex); } } – anbuselvan

+0

Entschuldigung, ich verstehe Ihren Kommentar nicht. 'STAThreadAttribute' kann auf' STAThread' verkürzt werden; das wird unterstützt. Meinst Du das? –

+0

Dies funktioniert nicht, [STAThread] wird nur am Programmeintrittspunkt (Main) erkannt. Verwenden Sie stattdessen Thread.SetApartmentState(). Sie müssen auch eine Nachrichtenschleife ausführen, Application.Run(). –

4

Ich hatte diesen Fehler vor und der einfachste Weg, Dispatcher verwendet.
meine Question und answer

Good Luck

+0

Bitte sagen Sie mir, warum diese Antwort schlecht ist, war es mein natürlicher Instinkt für eine Lösung –

+0

müssen Sie fragen, wer getan unten-Stimme! – Rev

+0

Ja, aber ich kann nicht, weshalb ich diesen offenen Posten verlassen habe, der jeden einlädt, der weiß, was mit dieser Lösung falsch ist, um zu antworten –

Verwandte Themen