Überlegungen zum Threading
Der COM+-Komponentenrekorder kann in der Multithread-Wohnung (MTA) des Prozesses oder in einem Singlethreaded Apartment (STA) ausgeführt werden. Wenn der Recorder in der STA ausgeführt wird, erfordert COM+, dass jedes Apartment, das Objekte enthält, über eine Message Queuing-Warteschlange verfügen muss, um Anrufe von anderen Prozessen und Apartments innerhalb desselben Prozesses zu verarbeiten. Dies bedeutet, dass die Arbeitsfunktion des Threads über eine Nachrichtenschleife verfügen muss. Wenn eine Komponente in der Warteschlange instanziiert wird, ist der zurückgegebene Schnittstellenzeiger immer ein Proxyschnittstellenzeiger und kein direkter Schnittstellenzeiger. Der Zeiger ist eigentlich ein Verweis auf eine instance des Rekorders. Wenn dieser Verweis auf die Aufzeichnungsschnittstelle an einen anderen Thread übergeben wird, muss der ursprüngliche Thread weiterhin die Windows-Nachrichtenschleife ausführen, damit der empfangende Thread die Schnittstelle aufheben kann. Ist dies nicht der Fall, bleibt der empfangende Thread in einem Aufruf von CoUnmarshalInterface hängen.
Wenn Sie zum Synchronisieren der Threads Primitive verwenden, sollten Sie msgWaitForMultipleObjects anstelle anderer Synchronisierungsfunktionen verwenden. Dadurch werden Nachrichten in der Warteschlange sowie der Zustand des Synchronisierungsobjekts überprüft.