Freigeben über


Grundlegendes zu Threadingproblemen

In diesem Thema werden allgemeine Threadingszenarien für Microsoft UI Automation-Clientimplementierungen beschrieben und erläutert, wie Probleme vermieden werden können, die auftreten, wenn ein Client Threading falsch verwendet.

Dieses Thema enthält folgende Abschnitte:

UI Automation und der UI-Thread

Aufgrund der Art und Weise, wie UI Automation Windows-Meldungen verwendet, können Konflikte auftreten, wenn eine Clientanwendung versucht, mit der eigenen UI über den UI-Thread zu interagieren. Diese Konflikte können dazu führen, dass die Leistung erheblich beeinträchtigt wird, oder sogar dazu, dass die Anwendung gar nicht mehr reagiert.

Wenn Ihre Clientanwendung mit allen Elementen auf dem Desktop interagieren soll, einschließlich der eigenen UI, sollten alle Aufrufe von UI Automation in einem separaten Thread ausgeführt werden. Dazu gehört beispielsweise das Suchen von Elementen mithilfe der Methode IUIAutomationTreeWalker oder IUIAutomationElement::FindAll und der Verwendung von Steuerungsmustern. Dieser Thread sollte keine Fenster besitzen und ein COM-Multithread-Apartment (COM) Multithread-Apartment (MTA)-Modellthread sein (ein Thread, der COM durch Aufrufen von CoInitializeEx mit dem Flag COINIT_MULTITHREADED initialisiert.)

UI Automation-Aufrufe können problemlos innerhalb eines UI Automation-Ereignishandlers ausgeführt werden, da der Ereignishandler stets in einem anderen als dem UI-Thread aufgerufen wird. Wenn Sie jedoch Ereignisse abonnieren, die möglicherweise von der UI Ihrer Clientanwendung stammen, müssen Sie den Aufruf von IUIAutomation::AddAutomationEventHandler oder einer verwandten Methode in einem Thread ausführen, der nicht zur Benutzeroberfläche gehört (bei dem es sich ebenfalls um einen MTA-Thread handeln sollte). Entfernen Sie Ereignishandler im gleichen Thread.

Ein UI Automation-Client sollte nicht mehrere Threads verwenden, um Ereignishandler hinzuzufügen oder zu entfernen. Wenn ein Ereignishandler hinzugefügt oder entfernt wird, während ein anderer im selben Clientprozess hinzugefügt oder entfernt wird, kann dies zu unerwartetem Verhalten führen.

Threadingmodell für Ereignishandler

Ein UI Automation-Client sollte das COM MTA-Threadingmodell für Threads verwenden, die Ereignishandler implementieren. Die Verwendung des Singlethread-Apartment (STA)-Modells kann Probleme verursachen, etwa das Entfernen von Ereignishandlern durch Clients aus dem Thread verhindern.

COM Apartment Affinity unter 64-Bit-Windows

Gemäß der COM-Spezifikation unterliegt die Lebensdauer eines Remoteobjekts der Lebensdauer des Appartements, in dem die CoCreateInstance-Funktion aufgerufen wird, um das Objekt zu erstellen. Wenn das ursprüngliche Appartement geschlossen wird, wird das Remoteobjekt ebenfalls freigegeben.

Bei UI Automation-Clients kann dieses COM-Verhalten bedeuten, dass die Lebensdauer des Remote 32/64-Hilfselements (erstellt von UIAutomationCore.dll), das von einem 32 Bit-Element verwendet wird, von der Appartement-Lebensdauer des Threads bestimmt wird, der das Element erstellt hat. Wenn der UI Automation-Client Marshalling für das Element in einen anderen Thread durchführt, kann das Element ungültig werden, wenn das ursprüngliche Appartement geschlossen wird. Der UI Automation-Client sollte diese Probleme ordnungsgemäß behandeln, indem Fehler beim Verwenden von Automation-Elementen mit Marshalling abgefangen werden.

Dasselbe Problem kann mit einem 32 Bit-UI Automation-Client auftreten, der 64-Bit-Elemente enthält.

Konzeptionell:

Abrufen von Benutzeroberflächenautomatisierungs-Elementen

Abonnieren von Benutzeroberflächenautomatisierungs-Ereignissen

Übersicht über Benutzeroberflächenautomatisierungs-Ereignisse

Weitere Ressourcen:

Beschreibungen und Funktionsweisen von OLE-Threadingmodellen