Frage

Können Sie STA und MTA in eigenen Worten erklären?

Auch, was sind Wohnung Fäden und tun sie sich nur auf COM betreffen? Wenn ja, warum?

War es hilfreich?

Lösung

Das COM-Threading-Modell ist eine "Wohnung" -Modell, in dem der Ausführungskontext von initialisierte COM-Objekten genannt entweder mit einem einzelnen Thread (Single Thread Apartment) oder vielen Threads (Multi Thread Apartment) zugeordnet ist. In diesem Modell, ein COM-Objekt einmal in einer Wohnung initialisiert, ist Teil dieser Wohnung für die Dauer der Laufzeit.

Das STA-Modell wird für COM-Objekte verwendet, die nicht Thread-sicher sind. Das bedeutet, dass sie nicht ihre eigene Synchronisierung behandeln. Eine gemeinsame Nutzung ist dies eine UI-Komponente. Also, wenn ein anderer Thread mit dem Objekt interagieren muss (wie beispielsweise einen Knopf in einer Form drückt), dann wird die Nachricht an dem STA Thread vermarshallten. Die Fenster bilden Nachricht Pumpsystem ist ein Beispiel dafür.

Wenn das COM-Objekt seine eigene Synchronisation verarbeiten kann, dann kann das MTA-Modell verwendet werden, wenn mehrere Threads mit dem Objekt zu interagieren dürfen ohne vermarshallten Anrufe.

Andere Tipps

Es ist alles darauf an, wie Anrufe an Objekte behandelt werden, und wie viel Schutz, den sie brauchen. COM-Objekte können die Laufzeit bitten, sie zu schützen vor von mehreren Threads gleichzeitig aufgerufen werden; diejenigen, die nicht tun können, möglicherweise gleichzeitig von verschiedenen Threads aufgerufen werden, so müssen sie ihre eigenen Daten schützen.

Darüber hinaus ist es auch erforderlich, dass die Laufzeit einen COM-Objekt Anruf von Blockieren der Benutzeroberfläche zu verhindern, wenn ein Anruf von einem Benutzeroberfläche Thread gemacht wird.

Ein Wohnung ist ein Ort für Objekte zu leben, und sie enthalten einen oder mehrere Threads. Die Wohnung wird definiert, was passiert, wenn Anrufe getätigt werden. Anrufe auf Objekte in einer Wohnung werden empfangen und verarbeitet wird auf jedem Thread in dieser Wohnung, mit der Ausnahme, dass ein Anruf von einem Thread bereits in der richtigen Wohnung wird von selbst verarbeitet (das heißt ein direkter Aufruf zum Objekt).

können Threads entweder in einem Singlethread-Apartment oder in einem Multi-Threaded Apartment (in diesem Fall werden sie der einzige Faden in dieser Wohnung sind). Sie legen fest, welche, wenn der Thread COM initialisiert für diesen Thread.

Die STA ist in erster Linie für die Kompatibilität mit der Benutzerschnittstelle, die zu einem bestimmten Thread gebunden ist. Eine STA empfängt Benachrichtigungen über Anrufe zu verarbeiten, indem ein Fenster Nachricht an ein ausgeblendetes Fenster empfängt; wenn es einen ausgehenden Anruf tätigt, es beginnt eine Schleife modal andere Meldung Fenstermeldungen zu verhindern, verarbeitet werden. Sie können einen Nachrichtenfilter angeben aufgerufen werden, so dass Ihre Anwendung auf andere Nachrichten reagieren zu können.

Im Gegensatz dazu alle MTA-Threads teilen sich eine einzige MTA für den Prozess. COM kann einen neuen Worker-Thread startet einen eingehenden Anruf zu handhaben, wenn keine Threads verfügbar sind, bis zu einem Pool zu begrenzen. Themen machen abgehende Anrufe einfach blockieren.

Der Einfachheit halber werden wir nur Objekte betrachten in DLLs implementiert, die in der Registrierung werben, was sie unterstützen, indem der ThreadingModel Wert Einstellung für Schlüssel ihrer Klasse. Es gibt vier Optionen:

  • Hauptgewinde (ThreadingModel Wert nicht vorhanden). Das Objekt wird auf dem Haupt-UI-Thread des Host erstellt, und alle Anrufe werden an diesen Thread umgeleitet. Die Klasse Fabrik wird nur auf diesem Thread aufgerufen werden.
  • Apartment. Dies zeigt an, dass die Klasse auf jedem Single-Threaded-Thread-Modus ausgeführt werden kann. Wenn der Thread, es ist ein STA-Thread erstellt, wird das Objekt auf dem Thread ausgeführt werden, sonst wird es in der Haupt STA erstellt werden - wenn kein Haupt-STA vorhanden ist, wird ein STA-Thread für sie erstellt. (Das bedeutet, MTA-Threads, die Apartment-Objekte erstellen werden alle Anrufe zu einem anderen Thread werden Rangier.) Die Klasse Fabrik kann gleichzeitig von mehreren STA-Threads aufgerufen werden, damit es seine internen Daten davor schützen muss.
  • Free. Dies deutet auf eine Klasse entworfen in dem MTA zu laufen. Es wird immer in der MTA laden, wenn auch von einem STA-Thread erstellt, was wiederum bedeutet, dass die Anrufe der STA-Thread rangieren. Dies liegt daran, ein Free Objekt im Allgemeinen mit der Erwartung geschrieben wird, dass sie blockieren können.
  • Both. Diese Klassen sind flexibel und Last in welcher auch immer Wohnung, die sie von erstellt sind. Sie müssen beide Arten von Anforderungen zu passen geschrieben werden, aber: sie ihren inneren Zustand gegen gleichzeitige Anrufe schützen müssen, falls sie in dem MTA geladen sind, darf aber nicht blockieren, falls sie sind in einem STA geladen

Aus dem .NET Framework, im Grunde verwendet nur [STAThread] auf jedem Thread, den UI erstellt. Worker-Threads sollten den MTA verwenden, es sei denn, sie werden Apartment markierte COM-Komponenten verwenden, wobei in diesem Fall verwenden Sie die STA-Overhead und Skalierbarkeit Probleme zu vermeiden, Rangier-, wenn die gleiche Komponente von mehreren Threads aufgerufen wird (wie jeder Thread müssen wartet für die Komponente in Umdrehung). Es ist viel einfacher, alle um, wenn Sie ein separates COM-Objekt pro Thread verwenden, ob die Komponente in den STA oder MTA ist.

Ich finde die bestehenden Erklärungen zu Kauderwelsch. Hier ist meine Erklärung in Klartext:

STA: Wenn ein Thread ein COM-Objekt erstellt, die STA-Set (wenn CoCreateXXX Aufruf können Sie eine Fahne übergeben, die das COM-Objekt zu STA-Modus setzt), dann wird nur dieser Thread kann dieses COM-Objekt zugreifen (das ist, was STA bedeutet - Single Threaded Apartment), unter der Haube anderer Thread gedreht rufen Methoden auf diesem COM-Objekt versucht, ist geräuschlos in Nachrichten an den Thread zu liefern, die (besitzt), um das COM-Objekt erstellt. Dies ist sehr ähnlich wie die Tatsache, dass nur der Thread, der ein UI-Steuerelement erstellt es direkt zugreifen kann. Und dieser Mechanismus sollte komplizierte Sperren / Entsperren Operationen verhindern.

MTA: Wenn ein Thread ein COM-Objekt erstellt, das auf MTA gesetzt wird, wird ziemlich viel kann jeder Thread direkt Methoden nennen.

Das ist so ziemlich das Wesentliche davon. Obwohl technisch es einige Details sind habe ich nicht, wie in der ‚STA‘ Absatz erwähnt, kann der Schöpfer Thread muss sich STA. Aber das ist so ziemlich alles, was Sie wissen müssen STA / MTA / NA zu verstehen.

STA (Single Threaded Apartment) ist im Grunde das Konzept, dass nur ein Thread mit Ihrem Code zu einem Zeitpunkt, zu interagieren. Anrufe in Ihre Wohnung werden über Windows-Nachrichten (mit einem nicht sichtbaren) Fenster gemarshallt. Auf diese Weise können Anrufe für den Betrieb in der Warteschlange und warten zu beenden.

MTA (Multi Threaded Apartment) ist, wo viele Fäden alle gleichzeitig arbeiten können und die Verantwortung liegt bei Ihnen als Entwickler der Faden Sicherheit zu behandeln.

Es gibt viel mehr zu erfahren über die Modelle in COM Threading, aber wenn Sie Probleme zu verstehen, was sie sind, dann würde ich sagen, dass das Verständnis, was die STA ist und wie es funktioniert wäre der beste Ausgangspunkt, weil die meisten COM-Objekte sein sind STA.

Apartment Threads, wenn ein Thread in der gleichen Wohnung wie das Objekt lebt sie mit, dann ist es ein Apartment-Thread. Ich denke, dass dies nur ein COM-Konzept ist, weil es nur eine Art und Weise des Sprechens über die Objekte und Themen sie interagieren mit ...

Jede EXE die Steuerelemente COM oder OLE-Hosts definiert sie Wohnung Zustand. Die Wohnung Zustand ist standardmäßig STA (und für die meisten Programme sollten STA sein).

STA - alle OLE-Steuerelemente von Notwendigkeit in einer STA leben müssen. STA bedeutet, dass das COM-Objekt muss immer auf dem UI-Thread manipuliert werden und nicht an anderen Fäden geführt werden kann (ähnlich wie jedes Oberflächenelement in MFC). Allerdings kann das Programm noch viele Threads haben.

MTA -. Sie können das COM-Objekt auf jedem Thread in Ihrem Programm manipulieren

Als mein Verständnis, das ‚Haus‘ verwendet, um die COM-Objekte von Multi-Thread-Problemen zu schützen.

Wenn ein COM-Objekt nicht Thread-sicher ist, sollte sie es als ein STA-Objekt deklariert. Dann wird nur der Thread, der es schafft sie zugreifen können. Die Schaffung Thread sollte sich als STA-Thread erklären. Unter der Haube speichert der Thread die STA Information in seinem TLS (Thread Local Storage). Wir nennen dieses Verhalten als dass der Faden eine STA Wohnung betritt. Wenn andere Threads dieses COM-Objekt zugreifen möchten, sollte es den Zugriff auf die Schaffung Thread Marschall. Grundsätzlich ist die Schaffung Thread von Nachrichten verwendet Mechanismus, um die in-bound Anrufe zu verarbeiten.

Wenn ein COM-Objekt Thread-sicher ist, sollte es es als ein MTA-Objekt deklariert. Das MTA-Objekt kann durch mehr Threads zugegriffen werden.

Code, die COM-Objekt DLLs aufruft (zB proprietäre Datendateien zu lesen), kann in einer Benutzeroberfläche funktioniert aber auf mysteriöse Weise aus einem Dienst hängen. Der Grund dafür ist, dass ab Net 2.0 Benutzeroberflächen STA übernehmen (thread-safe), während Dienste übernehmen MTA ((vor, dass Dienste angenommen STA). Mit einem STA-Thread für jeden COM-Aufruf in einem Dienst erstellen kann erheblichen Aufwand hinzufügen.

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