2009-05-14 2 views
3

Ich habe eine COM-Komponente, die in einem COM-Dienst instanziiert wird (diese .exe wird ausgeführt).Wie werden die Threads in einer COM-Komponente erstellt?

Ich habe zehn Kunden. Jeder Client erhält einen Schnittstellenzeiger (IXyz) von ROT und ruft gleichzeitig eine Methode IXyz :: abc() auf.

Aus meinen Spuren sehe ich, dass IXyz :: abc() 10 mal gleichzeitig aufgerufen wird, aber in 10 verschiedenen Threads.

Wer erstellt diese 10 Themen?

Antwort

0

Das COM-Subsystem tut das. Es erstellt einen separaten Thread für die Verarbeitung von verschiedenen Aufrufen, die gleichzeitig aufgerufen werden. Wenn es sich bei der Komponente um MTA handelt, werden die Anforderungen parallel ausgeführt. Wenn es sich bei der Komponente um eine STA handelt, werden sie nacheinander ausgeführt, um die Beschädigung von gemeinsam genutzten Variablen zu verhindern.

2

Das COM-Verhalten macht Sinn, wenn Sie darüber nachdenken. Der Code wird im Serviceprozess ausgeführt. Wenn Sie die Klasse für die Ausführung in Single Threaded Apartment markieren, wird jeweils nur ein Thread ausgeführt. Gleichzeitige Anrufe werden in der Nachricht qeueu gestapelt, die jeweils einzeln ausgeführt wird. Wenn ein Multithread-Apartment angegeben wird, kann der Code gleichzeitig ausgeführt werden. Um dies im laufenden Prozess zu erreichen, werden mehrere Threads zusammengesponnen, um dieses Verhalten zu erreichen.

Wenn Sie Nebenläufigkeitsprobleme vermeiden möchten, müssen Sie Ihre Klasse in eine DLL setzen. Dann haben Sie immer noch mehrere Threads, aber jeder wird im aufrufenden Prozess ausgeführt, so dass Sie sich keine Gedanken über den Status machen müssen.

Es gibt keine Möglichkeit, einen Codeblock gleichzeitig ohne Threads auszuführen. Selbst wenn Sie in separaten Prozessen ausführen, sind immer noch mehrere Threads involviert, sie sind nur durch die Prozessgrenze getrennt.

Ich bin nur belächelt die obvoouse Becayse Ich arbeitete einmal für eine Firma, die einfach nicht durch ihre Köpfe bekommen konnte. :-) Sie dachten, sie könnten Threading-Probleme vermeiden, indem sie in separaten Prozessen ausgeführt werden und Shared Memory (Memory Mapped Files) verwenden! Das funktionierte (irgendwie), als ihr Code auf einer einzelnen CPU lief und sie eine "Reparatur" -App hinzufügten, um die Widersprüche zu beheben. Bei der letzten Installation sind sie auf mehrere CPUs umgezogen und alles ist wirklich auseinander gefallen. Dann bin ich gegangen, das Ende.