Freigeben über


Verwaltetes und nicht verwaltetes Threading

Aktualisiert: November 2007

COM-Komponenten verwenden Apartments, um den Zugriff auf Ressourcen zu synchronisieren. Im Gegensatz dazu verwenden verwaltete Objekte synchronisierte Bereiche und Grundelemente der Synchronisation wie gegenseitigen Ausschluss, Sperrungen, Komplettierungsanschlüsse sowie synchronisierte Kontexte, um die threadsichere Verwendung aller gemeinsam genutzten Ressourcen zu gewährleisten. Weitere Informationen zum .NET-Threadingmodell finden Sie unter Verwaltetes Threading.

Bezüglich der Interoperabilität erstellt und initialisiert Common Language Runtime ein Apartment beim Aufruf eines COM-Objekts. Ein verwalteter Thread kann ein STA (Single-threaded Apartment) und ein MTA (Multi-threaded Apartment) erstellen und eingeben. Ein STA enthält nur einen Thread, ein MTA dagegen einen oder mehrere. Wenn ein COM-Apartment und ein Thread-generiertes Apartment kompatibel sind, kann der aufrufende Thread in COM die Aufrufe direkt an das COM-Objekt richten. Sind die Apartments nicht kompatibel, erstellt COM ein kompatibles Apartment und marshallt alle Aufrufe über einen Proxy in das neu erstellte Apartment.

Die Laufzeit ruft CoInitializeEx auf, um das COM-Apartment entweder als MTA- oder als STA-Apartment zu initialisieren. In .NET Framework, Version 2.0, werden verwaltete Threads als MTA initialisiert, wenn der Zustand ihres Apartments vor dem Start des Threads nicht festgelegt wurde. Verwenden Sie die SetApartmentState-Methode oder die TrySetApartmentState-Methode, um den Apartmentzustand vor dem Start des Threads festzulegen.

In .NET Framework, Version 2.0, wird der Hauptanwendungsthread als MTA initialisiert, sofern nicht STAThreadAttribute auf die Einstiegspunktprozedur angewendet wurde.

Hinweis:

In .NET Framework, Version 1.0 und 1.1, konnte der Apartmentzustand, nachdem der Thread bereits ausgeführt wurde, mithilfe der System.Threading.ApartmentState-Eigenschaft festgelegt werden, wodurch eine Racebedingung entstand. In .NET Framework, Version 2.0, ist dies nicht zulässig.

Bei einigen Programmiermodellen müssen Sie die STA-Eigenschaft in einem Thread festlegen. Damit Windows Forms z. B. Elemente wie Drag & Drop initialisiert, müssen Sie ein Singlethread-Apartment erstellen und eingeben.

Hinweis:

Sind weder der Proxy und der Stub noch die Typbibliothek registriert, kann beim Aufruf eines COM-Objekts von verwaltetem Code die Ausnahme InvalidCastException auftreten.

In der folgenden Tabelle sind die Enumerationswerte für ApartmentState zusammen mit den vergleichbaren Initialisierungsaufrufen für ein COM-Apartment dargestellt.

Enumerationswert für ApartmentState

COM-Apartment-Initialisierung

MTA

CoInitializeEx(NULL, COINIT_MULTITHREADED)

STA

CoIntializeEx(NULL, COINIT_APARTMENTTHREADED)

Unbekannt

CoInitializeEx(NULL, COINIT_MULTITHREADED)

Befinden sich das COM-Objekt und der verwaltete Thread in nicht kompatiblen Apartments, werden alle Objektaufrufe durch einen von COM erstellten Proxy durchgeführt.

Siehe auch

Konzepte

Verfügbarmachen von COM-Komponenten für .NET Framework

Verfügbarmachen von .NET Framework-Komponenten in COM

Weitere Ressourcen

Erweiterte COM-Interoperabilität