Antworten:
Dies STAThreadAttribute
ist 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).
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.
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
[STAThread]
?