Warum sind WinForms Anwendungen STAThread standardmäßig?

17

Wenn Sie eine leere WinForms -Anwendung mit Visual Studio erstellen, enthält die Vorlage das Attribut STAThread in der Hauptanwendungsklasse.

Ich habe einige Dokumente darüber gelesen, aber ich bin mir nicht sicher, ob ich es überhaupt verstanden habe.

Ich habe wirklich ein paar Fragen dazu:

  1. Warum wird dieses Attribut hinzugefügt?
  2. Was heißt das?
  3. Was passiert, wenn Sie dieses Attribut entfernen?
Daniel Peñalba 11.01.2011, 15:25
quelle

4 Antworten

12
  

1. Warum wird dieses Attribut hinzugefügt?

Weil es vom ActiveX-Objektmodell benötigt wird. Und Sie können ActiveX-Steuerelemente in einem WinForm (damit es aus Kompatibilitätsgründen ist) ablegen ODER einige .NET-Klassen verwenden native Steuerelemente, die dieses Attribut erfordern.

  

2. Was bedeutet das?

Dies bedeutet, dass der Thread im Singlethread-Apartmentmodell ausgeführt wird.

  

3. Was passiert, wenn Sie dieses Attribut entfernen?

Wenn das Attribut entfernt wird, ist das Verhalten nicht definiert. Das Programm kann zufällig ausfallen, mit manchmal sinnvollen Fehlermeldungen. Zum Beispiel können Dinge jetzt funktionieren, dann brechen Sie mit einem Service Pack.

    
TomTom 11.01.2011, 15:27
quelle
19

Um aus einem MSDN-Blog zu zitieren,

  

Wenn das STAThreadAttribute angewendet wird, ändert es den Appartment-Status des aktuellen Threads so, dass er single threaded ist. Ohne auf eine umfangreiche Diskussion über COM und Threading einzugehen, stellt dieses Attribut den Kommunikationsmechanismus zwischen dem aktuellen Thread und anderen Threads sicher, die möglicherweise über COM mit ihm kommunizieren möchten. Wenn Sie Windows Forms verwenden, verwendet es abhängig von der von Ihnen verwendeten Funktion möglicherweise COM-Interop, um mit Betriebssystemkomponenten zu kommunizieren. Gute Beispiele hierfür sind die Zwischenablage und die Dateidialoge.

    
Alex Fort 19.09.2008 14:49
quelle
3
  

3.Was passiert, wenn Sie dieses Attribut entfernen?

Ich füge einfach ein einfaches Beispiel hinzu, das das Problem demonstriert.

Ich habe eine einfache WinForms App mit einem Button und einem OpenFileDialog erstellt. Auf Knopfdruck starte ich einen Thread, der den openFileDialog anzeigt. Ich starte die App mit und ohne STAThread und die Ergebnisse der Klick auf die Schaltfläche sind gleich - es löst die Ausnahme "Cross-Thread-Operation nicht gültig: Control 'Form1' von einem anderen Thread als der Thread, auf dem es erstellt wurde". Es sieht so aus, als gäbe es keinen Unterschied. Aber nein.

Dann habe ich den openFileDialog durch Aufruf der folgenden Methode geändert:

%Vor%

Mit STAThread funktioniert es wie erwartet. Ohne STAThread wird die Ausnahme ausgelöst: "Aktueller Thread muss auf Single Thread Apartment (STA) -Modus festgelegt werden, bevor Ole-Aufrufe vorgenommen werden können. Stellen Sie sicher, dass Ihre Main-Funktion STAThreadAttribute markiert hat. Diese Ausnahme wird nur ausgelöst, wenn ein Debugger an den Prozess angehängt ist." >

Dann starte ich die App mehrmals ohne Debugger (losgelöst vom Visual Studio). Einmal wurde die App still geschlossen, ein anderes Mal schloss die App mit der Meldung "vshost hat aufgehört zu arbeiten"

    
Mari 08.01.2016 23:45
quelle
0

Das bedeutet, dass Windows Forms-Programme einen Singlethread-Apartmentstatus verwenden. MTA- und Free-Threading-Appliance-Status werden nicht unterstützt.

    
Ben Hoffstein 19.09.2008 14:50
quelle

Tags und Links