Frage

Ich habe ältere COM-Komponente, und meine Aufgabe ist es Web-Service zu schreiben, die die COM und ermöglichen gleichzeitig nicht-blockierende Aufrufe wickeln.

Vor allem weil das COM-Objekt selbst staatenlos ist, habe ich beschlossen, die [Threadstatic] Attribut zu verwenden, so dass jeder Thread wird eine eigene Instanz des COM-Objekts hat die Verwendung der Sperre {} Anweisung zu verhindern und echte gleichzeitige Verarbeitung ermöglichen , aber es scheint, dass alle Anrufe noch procceeded synchron.

Ich schrieb einen Testcode, der eine Methode aus der COM-Komponente synchron läuft mit für {} Schleife und dann zweiten Thread fügte hinzu, dass genau das gleiche tun, aber auf einem andere Instanz des COM-Objekts, und ich sah keine Änderungen, X Anrufe immer verbrauchen Y Zeitspanne, zählen ganz gleich von Threads. Es ist wie es ist eine statische Sperre oder etwas ...

Trotz, dass getrennte Prozesse können jeden Anruf gleichzeitig für die Echt verarbeiten. Was aus separaten Threads verhindern, das gleiche verhalten?

Was kann ich echte gleichzeitige Anrufe an die COM-Komponente ermöglichen tun?

War es hilfreich?

Lösung

COM Einfädeln bewusst und wird das Threading-Modell von der Co-Klasse angefordert ehren. Er veröffentlicht seine Threading Anforderungen mit dem ThreadingModel Wert in der Registrierung. Wenn es auf „Apartment“ gesetzt ist (oder fehlt), wird COM sicherstellen, dass alle Methodenaufrufe aus einer Single-Threaded-Wohnung gemacht werden durch einen Proxy für die Schnittstellen Sie QI zurück. Der Proxy stellt sicher, wird der Anruf an den richtigen Thread gemarshallt.

Sie konnten betrüge und den Interface-Zeiger verwenden, die Sie bekommen, wenn Sie die Co-Klasse in einem STA-Thread erstellt und Anrufe tätigen, ohne Marshalling. Da die Co-Klasse bereits gesagt, es nicht in der Lage Multi-Threading ist, dann ist dies sehr unwahrscheinlich, richtig zu arbeiten. Sie müssen nur zufällig beschädigt internen Zustand.

Lizenziert unter: CC-BY-SA mit Zuschreibung
Nicht verbunden mit StackOverflow
scroll top