STAThread und Multithreading
-
03-07-2019 - |
Frage
Aus dem MSDN-Artikel auf STAThread:
Gibt an, dass das COM-Threading-Modell für eine Anwendung ist Single-Threaded Apartment (STA).
(Als Referenz ist das den gesamten Artikel .)
Single-Threaded Apartment ... OK, das über den Kopf ging. Außerdem habe ich irgendwo gelesen, dass es sei denn, die Anwendung von COM-Interop verwendet, dieses Attribut tatsächlich tut nichts. Also, was genau tut es, und wie funktioniert es Multithreading-Anwendungen auswirken? Sollten Multithreading-Anwendungen (die alles von jedermann enthält Timer
s asynchrone Methodenaufrufe, nicht nur threadpools und dergleichen verwendet wird) verwenden MTAThread, auch wenn es ‚nur um sicher zu sein‘? Was bedeutet STAThread und MTAThread eigentlich tun?
Lösung
Apartment Threading ist ein COM-Konzept; wenn Sie nicht mit COM, und keiner der APIs, die Sie verwenden COM „unter der Decke“ nennen, dann brauchen Sie sich nicht um Wohnungen zu sorgen.
Wenn Sie müssen sich bewusst Wohnungen sein, dann können die Details erhalten ein wenig kompliziert ; eine wohl stark vereinfachte Version ist, dass COM-Objekte als STA markiert muss auf einem STAThread ausgeführt werden, und COM-Objekte markiert MTA auf einem MTA-Thread ausgeführt werden muß. Mit Hilfe dieser Regeln, COM kann Anrufe zwischen diesen verschiedenen Objekten optimieren, vermeiden Marshalling, wo es nicht notwendig ist.
Andere Tipps
Was es das tut es sorgt dafür, dass CoInitialize
COINIT_APARTMENTTHREADED als Parameter aufgerufen wird, angeben. Wenn Sie keine COM-Komponenten verwenden oder ActiveX-Steuerelemente wird es überhaupt keine Wirkung auf Sie haben. Wenn Sie das tun, dann ist es eine Art von entscheidenden Bedeutung.
Steuerelemente, die Wohnung Gewinde sind effektiv Single-Threaded, Anrufe, um sie nur in der Wohnung verarbeitet werden, dass sie erstellt wurden.
Einige ausführlicher von MSDN:
Objekte in einem Single-Threaded erstellt Apartment (STA) erhalten Methodenaufrufe nur aus Faden ihrer Wohnung ist, so nur Anrufe werden serialisiert und ankommen bei Nachrichtenwarteschlange Grenzen (wenn die Win32-Funktion PeekMessage oder Sendmessage genannt wird).
Objekte auf einem COM-Thread in einem geschaffenen Multi-Thread-Apartment (MTA) muss sein können Methodenaufrufe erhalten aus andere Threads zu jeder Zeit. Du würdest implementieren typischerweise eine Form von Gleichzeitigkeitssteuerung in einem multithreaded Objektcode Win32 Synchronisations Primitiven wie kritische Abschnitte, Semaphore oder Mutex das Objekt der zum Schutz Daten.
Wenn ein Objekt, das so konfiguriert ist, läuft in der neutralen Gewinde Wohnung (NTA) von einem Thread aufgerufen, die in ist entweder eine STA oder die MTA, dass Faden Transfer zum NTA. Wenn dieser Thread Anschließend ruft CoInitializeEx, die Aufruf schlägt fehl und kehrt RPC_E_CHANGED_MODE.
STAThread wird vor der Hauptfunktion eines C # GUI-Projekt geschrieben. Es tut nichts, sondern erlaubt das Programm einen einzigen Thread zu erstellen.