Was macht [STAThread]?

293

Ich lerne C # 3.5 und möchte wissen, was [STAThread]in unseren Programmen funktioniert.

odiseh
quelle

Antworten:

240

Dies STAThreadAttributeist im Wesentlichen eine Voraussetzung für die Kommunikation der Windows-Nachrichtenpumpe mit COM-Komponenten. Obwohl Windows Forms im Kern kein COM verwendet, verwenden viele Komponenten des Betriebssystems, z. B. Systemdialoge, diese Technologie.

MSDN erklärt den Grund etwas ausführlicher:

STAThreadAttribute gibt an, dass das COM-Threading-Modell für die Anwendung Single-Threaded-Apartment ist. Dieses Attribut muss am Einstiegspunkt einer Anwendung vorhanden sein, die Windows Forms verwendet. Wenn es weggelassen wird, funktionieren die Windows-Komponenten möglicherweise nicht richtig. Wenn das Attribut nicht vorhanden ist, verwendet die Anwendung das Multithread-Apartmentmodell, das für Windows Forms nicht unterstützt wird.

Dieser Blog-Beitrag ( Warum ist STAThread erforderlich? ) Erklärt die Anforderung ebenfalls recht gut. Weitere Informationen zur Funktionsweise des Threading-Modells auf CLR-Ebene finden Sie in diesem Artikel des MSDN-Magazins vom Juni 2004 (Archiviert, April 2009).

Noldorin
quelle
1
Irgendeine Idee, warum CompactFramework nicht unterstützt [STAThread]?
bvdb
1
stackoverflow.com/questions/4154429/apartmentstate-for-dummies Diese Antwort ist für Sterbliche wie mich ziemlich verständlich. Nur als Referenz hier
hinzugefügt
41

Es teilt dem Compiler mit, dass Sie sich in einem Single Thread Apartment-Modell befinden. Dies ist eine böse COM-Sache, sie wird normalerweise für Windows Forms (GUIs) verwendet, da Win32 für die Zeichnung verwendet wird, die als STA implementiert ist. Wenn Sie ein STA-Modell aus mehreren Threads verwenden, erhalten Sie beschädigte Objekte.

Aus diesem Grund müssen Sie die GUI von einem anderen Thread aus aufrufen (wenn Sie eine Formularcodierung durchgeführt haben).

Machen Sie sich im Grunde keine Sorgen, akzeptieren Sie einfach, dass Windows-GUI-Threads als STA markiert sein müssen, da sonst seltsame Dinge passieren.

Spence
quelle
2
STAThread hat nichts mit der Anforderung zu tun, den Hauptthread beim Zugriff auf die GUI aufzurufen. Dies liegt einfach an der Art der Windows-Nachrichtenpumpe und kann in Multithread-Anwendungen nicht allgemeiner vermieden werden.
Noldorin
3
In Wirklichkeit geht es nur um COM-Komponenten wie Betriebssystemdialoge und Komponenten von Drittanbietern.
Noldorin
3
Win32 hat kein Konzept zum Einfädeln von Wohnungen, seine COM, die das Konzept einführt. COM "führt" ein vollständig threadunabhängiges System (die Windows-Nachrichtenpumpe) neu aus, um die Codeausführung in COM-Apartments zu synchronisieren / zu serialisieren.
AnthonyWJones
1
Akzeptieren Sie einfach, dass Windows-GUI-Köpfe als STA markiert sein müssen, da sonst seltsame Dinge passieren. :))))))
Nipuna
1
@Noldorin "Anforderung zum Aufrufen des Hauptthreads" - dies ist technisch keine Anforderung . Threadübergreifende Ausnahmen treten außerhalb des Debuggers nicht auf. Ref: stackoverflow.com/questions/3972727/… . Nicht zu sagen, dass Sie dieses Problem jedoch nicht lösen sollten!
Shiv
31

Das STAThreadAttribute markiert einen Thread zur Verwendung des Single-Threaded-COM-Apartments, wenn COM benötigt wird. Standardmäßig initialisiert .NET COM überhaupt nicht. Nur wenn COM benötigt wird, z. B. wenn ein COM-Objekt oder ein COM-Steuerelement erstellt wird oder wenn Drag & Drop erforderlich ist, wird COM initialisiert. In diesem Fall ruft .NET die zugrunde liegende CoInitializeEx-Funktion auf, die ein Flag verwendet, das angibt, ob der Thread mit einer Multithread- oder Single-Thread-Wohnung verbunden werden soll.

Weitere Informationen finden Sie hier (Archiviert, Juni 2009)

und

Warum ist STAThread erforderlich?

rahul
quelle