Grundlegendes zu Threadingproblemen

In diesem Thema werden gängige Threadingszenarien für Microsoft Benutzeroberflächenautomatisierung Clientimplementierungen beschrieben und erläutert, wie Probleme vermieden werden können, die auftreten können, wenn ein Client Threading falsch verwendet.

Dieses Thema enthält folgende Abschnitte:

Benutzeroberflächenautomatisierung und der UI-Thread

Aufgrund der Art und Weise, wie Benutzeroberflächenautomatisierung Windows-Nachrichten verwendet, können Konflikte auftreten, wenn eine Clientanwendung versucht, mit ihrer eigenen Benutzeroberfläche im UI-Thread zu interagieren. Diese Konflikte können zu einer sehr langsamen Leistung führen oder sogar dazu führen, dass die Anwendung nicht mehr reagiert.

Wenn Ihre Clientanwendung für die Interaktion mit allen Elementen auf dem Desktop vorgesehen ist, einschließlich der eigenen Benutzeroberfläche, sollten Sie alle Benutzeroberflächenautomatisierung Aufrufe aus einem separaten Thread ausführen. Dazu gehört das Suchen von Elementen, z. B. mithilfe von IUIAutomationTreeWalker oder der IUIAutomationElement::FindAll-Methode und der Verwendung von Steuerelementmustern. Dieser Thread sollte keine Fenster besitzen und ein COM-Multithreaded Apartment-Modellthread (Component Object Model, MTA) sein (einer, der COM durch Aufrufen von CoInitializeEx mit dem flag COINIT_MULTITHREADED initialisiert.)

Es ist sicher, Benutzeroberflächenautomatisierung Aufrufe in einem Benutzeroberflächenautomatisierung-Ereignishandler auszuführen, da der Ereignishandler immer in einem Nicht-UI-Thread aufgerufen wird. Beim Abonnieren von Ereignissen, die möglicherweise von der Benutzeroberfläche Ihrer Clientanwendung stammen, müssen Sie jedoch IUIAutomation::AddAutomationEventHandler oder eine zugehörige Methode für einen Nicht-UI-Thread aufrufen (der auch ein MTA-Thread sein sollte). Entfernen Sie Ereignishandler im gleichen Thread.

Ein Benutzeroberflächenautomatisierung-Client sollte nicht mehrere Threads verwenden, um Ereignishandler hinzuzufügen oder zu entfernen. Unerwartetes Verhalten kann auftreten, wenn ein Ereignishandler hinzugefügt oder entfernt wird, während ein anderer im selben Clientprozess hinzugefügt oder entfernt wird.

Threadingmodell für Ereignishandler

Ein Benutzeroberflächenautomatisierung-Client sollte das COM-MTA-Threadingmodell für Threads verwenden, die Ereignishandler implementieren. Die Verwendung des Sta-Modells (Single-Threaded Apartment) kann Probleme verursachen, z. B. das Entfernen von Ereignishandlern aus dem Thread durch Clients.

COM-Apartmentaffinität unter 64-Bit-Windows

Gemäß der COM-Spezifikation wird die Lebensdauer eines Remoteobjekts durch die Lebensdauer des Apartments bestimmt, in dem die CoCreateInstance-Funktion aufgerufen wird, um das Objekt zu erstellen. Wenn das ursprüngliche Apartment heruntergefahren wird, wird auch das Remoteobjekt freigegeben.

Für Benutzeroberflächenautomatisierung-Clients kann dieses COM-Verhalten bedeuten, dass die Lebensdauer des remoten 32/64-Hilfsprogramms (erstellt von UIAutomationCore.dll), das von einem 32-Bit-Element verwendet wird, von der Apartmentlebensdauer des Threads bestimmt wird, der das Element erstellt hat. Wenn der Benutzeroberflächenautomatisierung Client das Element in einen anderen Thread marshallt, kann das Element ungültig werden, wenn das ursprüngliche Apartment heruntergefahren wird. Der Benutzeroberflächenautomatisierung-Client sollte diese Probleme ordnungsgemäß behandeln, indem Fehler bei verwendung gemarster Automatisierungselemente abgefangen werden.

Das gleiche Problem kann bei einem 32-Bit-Benutzeroberflächenautomatisierung-Client auftreten, der über 64-Bit-Elemente verfügt.

Konzept

Abrufen von Benutzeroberflächenautomatisierungs-Elementen

Abonnieren von Benutzeroberflächenautomatisierung Ereignissen

Übersicht über Benutzeroberflächenautomatisierungs-Ereignisse

Andere Ressourcen

INFO: Beschreibungen und Funktionsweisen von OLE-Threadingmodellen