it-swarm.com.de

Könnten Sie STA und MTA erklären?

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

Was sind Apartment-Threads und beziehen sie sich nur auf COM? Wenn ja warum?

378
John

Das COM-Threading-Modell wird als "Apartment" -Modell bezeichnet, bei dem der Ausführungskontext initialisierter COM-Objekte entweder einem einzelnen Thread (Single Thread Apartment) oder vielen Threads (Multi Thread Apartment) zugeordnet ist. In diesem Modell ist ein COM-Objekt, das einmal in einer Wohnung initialisiert wurde, für die Dauer seiner Laufzeit Teil dieser Wohnung.

Das STA-Modell wird für COM-Objekte verwendet, die nicht threadsicher sind. Das heißt, sie kümmern sich nicht um ihre eigene Synchronisation. Eine gebräuchliche Verwendung ist eine UI-Komponente. Wenn also ein anderer Thread mit dem Objekt interagieren muss (z. B. eine Schaltfläche in einem Formular drücken), wird die Nachricht auf den STA-Thread verschoben. Das Windows Forms Message Pumping System ist ein Beispiel dafür.

Wenn das COM-Objekt seine eigene Synchronisation verarbeiten kann, kann das MTA-Modell verwendet werden, bei dem mehrere Threads mit dem Objekt interagieren können, ohne Aufrufe zu marshallen.

350
Joseph Daigle

Es kommt darauf an, wie Anrufe an Objekte gehandhabt werden und wie viel Schutz sie benötigen. COM-Objekte können die Laufzeitumgebung auffordern, sie vor dem gleichzeitigen Aufruf durch mehrere Threads zu schützen. diejenigen, die möglicherweise nicht gleichzeitig von verschiedenen Threads aufgerufen werden können, müssen daher ihre eigenen Daten schützen.

Außerdem muss zur Laufzeit verhindert werden, dass ein COM-Objektaufruf die Benutzeroberfläche blockiert, wenn ein Aufruf über einen Benutzeroberflächenthread erfolgt.

Ein apartment ist ein Ort, an dem Objekte leben können und der einen oder mehrere Threads enthält. Die Wohnung definiert, was passiert, wenn Anrufe getätigt werden. Anrufe an Objekte in einer Wohnung werden auf jedem Thread in dieser Wohnung empfangen und verarbeitet, mit der Ausnahme, dass ein Anruf eines Threads, der sich bereits in der richtigen Wohnung befindet, von sich aus verarbeitet wird (d. H. Ein direkter Anruf an das Objekt).

Threads können sich entweder in einem Apartment mit einem Thread (in diesem Fall sind sie der einzige Thread in diesem Apartment) oder in einem Apartment mit mehreren Threads befinden. Sie geben an, welcher COM-Thread für diesen Thread initialisiert wird.

Die STA dient hauptsächlich der Kompatibilität mit der Benutzeroberfläche, die an einen bestimmten Thread gebunden ist. Eine STA empfängt Benachrichtigungen über zu verarbeitende Anrufe, indem sie eine Fensternachricht an ein verstecktes Fenster empfängt. Wenn ein ausgehender Anruf getätigt wird, wird eine modale Nachrichtenschleife gestartet, um zu verhindern, dass andere Fensternachrichten verarbeitet werden. Sie können einen Nachrichtenfilter angeben, der aufgerufen werden soll, damit Ihre Anwendung auf andere Nachrichten reagieren kann.

Im Gegensatz dazu teilen sich alle MTA-Threads einen einzelnen MTA für den Prozess. COM startet möglicherweise einen neuen Arbeitsthread, um einen eingehenden Anruf zu verarbeiten, wenn keine Threads verfügbar sind, bis zu einem Poollimit. Threads, die ausgehende Anrufe tätigen, werden einfach blockiert.

Der Einfachheit halber betrachten wir nur Objekte, die in DLLs implementiert sind, die in der Registrierung bekannt machen, was sie unterstützen, indem Sie den Wert ThreadingModel für den Schlüssel ihrer Klasse festlegen. Es gibt vier Möglichkeiten:

  • Haupt-Thread (ThreadingModel Wert nicht vorhanden). Das Objekt wird im Haupt-UI-Thread des Hosts erstellt, und alle Aufrufe werden an diesen Thread geleitet. Die Klassenfactory wird nur für diesen Thread aufgerufen.
  • Apartment. Dies zeigt an, dass die Klasse auf jedem Singlethread-Modus-Thread ausgeführt werden kann. Wenn es sich bei dem erstellten Thread um einen STA-Thread handelt, wird das Objekt auf diesem Thread ausgeführt. Andernfalls wird es in der Haupt-STA erstellt. Wenn keine Haupt-STA vorhanden ist, wird ein STA-Thread für diesen Thread erstellt. (Dies bedeutet, dass MTA-Threads, die Apartment-Objekte erstellen, alle Aufrufe eines anderen Threads zusammenfassen.) Die Klassenfactory kann von mehreren STA-Threads gleichzeitig aufgerufen werden, sodass ihre internen Daten davor geschützt werden müssen.
  • Free. Dies weist auf eine Klasse hin, die für die Ausführung im MTA vorgesehen ist. Es wird immer in den MTA geladen, auch wenn es von einem STA-Thread erstellt wurde, was wiederum bedeutet, dass die Aufrufe des STA-Threads gemarshallt werden. Dies liegt daran, dass ein Free -Objekt im Allgemeinen mit der Erwartung geschrieben wird, dass es blockieren kann.
  • Both. Diese Klassen sind flexibel und können in jede Wohnung geladen werden, aus der sie erstellt wurden. Sie müssen jedoch so geschrieben sein, dass sie beiden Anforderungssätzen entsprechen: Sie müssen ihren internen Status vor gleichzeitigen Aufrufen schützen, falls sie in den MTA geladen werden, und dürfen nicht blockieren, falls sie in eine STA geladen werden.

Verwenden Sie in .NET Framework einfach [STAThread] für jeden Thread, der eine Benutzeroberfläche erstellt. Worker-Threads sollten den MTA verwenden, es sei denn, sie verwenden COM-Komponenten mit dem Zeichen Apartment. In diesem Fall sollten Sie die STA verwenden, um Probleme mit dem Aufwand und der Skalierbarkeit beim Marshalling zu vermeiden, wenn dieselbe Komponente von mehreren Threads (jeweils) aufgerufen wird Thread muss wiederum auf die Komponente warten). Es ist viel einfacher, wenn Sie ein separates COM-Objekt pro Thread verwenden, unabhängig davon, ob sich die Komponente in der STA oder im MTA befindet.

199
Mike Dimmick

Ich finde die vorhandenen Erklärungen zu bescheuert. Hier ist meine Erklärung in einfachem Englisch:

STA: Wenn ein Thread ein COM-Objekt erstellt, das auf STA gesetzt ist (beim Aufrufen von CoCreateXXX können Sie ein Flag übergeben, das das COM-Objekt in den STA-Modus versetzt), kann nur dieser Thread auf dieses COM-Objekt zugreifen (was STA bedeutet - Single Threaded Apartment) ), wird ein anderer Thread, der versucht, Methoden für dieses COM-Objekt aufzurufen, unbemerkt in die Zustellung von Nachrichten an den Thread umgewandelt, der das COM-Objekt erstellt (besitzt). Dies ähnelt der Tatsache, dass nur der Thread, der ein UI-Steuerelement erstellt hat, direkt darauf zugreifen kann. Und dieser Mechanismus soll komplizierte Sperr-/Entsperrvorgänge verhindern.

MTA: Wenn ein Thread ein COM-Objekt erstellt, das auf MTA gesetzt ist, kann so ziemlich jeder Thread Methoden direkt aufrufen.

Das ist so ziemlich das Wesentliche. Obwohl es technisch gesehen einige Details gibt, die ich nicht erwähnt habe, wie im Abschnitt 'STA', muss der Ersteller-Thread selbst STA sein. Aber das ist so ziemlich alles, was Sie wissen müssen, um STA/MTA/NA zu verstehen.

74
Weipeng L

STA (Single Threaded Apartment) ist im Grunde das Konzept, dass jeweils nur ein Thread mit Ihrem Code interagiert. Anrufe in Ihre Wohnung werden über Windows-Nachrichten (mit einem nicht sichtbaren Fenster) gemarshallt. Auf diese Weise können Anrufe in die Warteschlange gestellt und auf den Abschluss der Vorgänge gewartet werden.

In MTA (Multi Threaded Apartment) können viele Threads gleichzeitig ausgeführt werden, und Sie als Entwickler sind für die Thread-Sicherheit verantwortlich.

Es gibt noch viel mehr über Threading-Modelle in COM zu lernen, aber wenn Sie Probleme haben zu verstehen, was sie sind, würde ich sagen, dass das Verstehen der STA und ihrer Funktionsweise der beste Ausgangspunkt ist, da die meisten COM-Objekte STAs sind.

Apartment-Threads: Wenn ein Thread in derselben Wohnung wie das Objekt, das er verwendet, lebt, handelt es sich um einen Apartment-Thread. Ich denke, dies ist nur ein COM-Konzept, da es nur eine Art und Weise ist, über die Objekte und Threads zu sprechen, mit denen sie interagieren.

22
Brian ONeil

Jede EXE-Datei, die COM oder OLE Steuerelemente enthält, definiert den Apartment-Status. Der Apartment-Status ist standardmäßig STA (und für die meisten Programme sollte STA verwendet werden).

STA - Alle OLE Steuerelemente müssen notwendigerweise in einer STA leben. STA bedeutet, dass Ihr COM-Objekt immer manipuliert werden muss auf dem UI-Thread und kann nicht an andere Threads übergeben werden (ähnlich wie bei jedem UI-Element in MFC), Ihr Programm kann jedoch immer noch viele Threads haben.

MTA - Sie können das COM-Objekt in jedem Thread Ihres Programms bearbeiten.

18
Nick

Meines Erachtens wird das "Apartment" verwendet, um die COM-Objekte vor Multithreading-Problemen zu schützen.

Wenn ein COM-Objekt nicht threadsicher ist, sollte es als STA-Objekt deklariert werden. Dann kann nur der Thread, der es erstellt, darauf zugreifen. Der Erstellungs-Thread sollte sich selbst als STA-Thread deklarieren. Unter der Haube speichert der Thread die STA-Informationen in seinem TLS (Thread Local Storage). Wir nennen dieses Verhalten, da der Thread eine STA-Wohnung betritt. Wenn andere Threads auf dieses COM-Objekt zugreifen möchten, sollte der Zugriff auf den Erstellungs-Thread gemarshallt werden. Grundsätzlich verwendet der Erstellungs-Thread einen Nachrichtenmechanismus, um die eingehenden Aufrufe zu verarbeiten.

Wenn ein COM-Objekt threadsicher ist, sollte es als MTA-Objekt deklariert werden. Auf das MTA-Objekt kann über mehrere Threads zugegriffen werden.

11
Kevin C.

Code, der COM-Objekt-DLLs aufruft (z. B. um proprietäre Datendateien zu lesen), funktioniert möglicherweise in einer Benutzeroberfläche, hängt jedoch auf mysteriöse Weise von einem Dienst ab. Der Grund dafür ist, dass ab .NET 2.0 die Benutzeroberflächen STA (thread-safe) und die Dienste MTA (davor STA) annehmen. Das Erstellen eines STA-Threads für jeden COM-Aufruf in einem Dienst kann zu einem erheblichen Mehraufwand führen.

4
user2696845