共用方式為


了解線程問題

本主題描述Microsoft 使用者介面自動化客戶端實作的常見線程案例,並說明如何避免用戶端使用線程錯誤時可能發生的問題。

本主題包含下列幾節:

使用者介面自動化和UI線程

由於 使用者介面自動化 使用 Windows 訊息的方式,當用戶端應用程式嘗試與 UI 線程上自己的 UI 互動時,可能會發生衝突。 這些衝突可能會導致效能非常慢,甚至會導致應用程式停止回應。

如果您的用戶端應用程式是要與桌面上的所有元素互動,包括自己的UI,您應該從個別線程進行所有 使用者介面自動化呼叫。 這包括使用 IUIAutomationTreeWalkerIUIAutomationElement::FindAll 方法,以及使用控件模式來尋找元素。 此線程不應擁有任何視窗,而且應該是元件物件模型 (COM) 多線程 Apartment (MTA) 模型線程 (其中一個線程會使用 COINIT_MULTITHREADED 旗標呼叫 CoInitializeEx 來初始化 COM。

在 使用者介面自動化 事件處理程式中進行 使用者介面自動化 呼叫是安全的,因為事件處理程式一律會在非UI線程上呼叫。 不過,訂閱可能來自用戶端應用程式 UI 的事件時,您必須在非 UI 線程上呼叫 IUIAutomation::AddAutomationEventHandler 或相關的方法(這也應該是 MTA 線程)。 在相同執行緒上移除事件處理常式。

使用者介面自動化 客戶端不應該使用多個線程來新增或移除事件處理程式。 如果在相同客戶端進程中新增或移除另一個事件處理程式,則非預期的行為可能會導致。

事件處理程序的線程模型

使用者介面自動化 客戶端應該針對實作事件處理程式的線程使用 COM MTA 線程模型。 使用單個線程 Apartment (STA) 模型可能會導致問題,例如防止客戶端從線程中移除事件處理程式。

64 位 Windows 上的 COM Apartment Affinity

根據 COM 規格,遠端物件的存留期是由呼叫CoCreateInstance函式來建立物件的Apartment存留期所控管。 當原始 Apartment 關閉時,也會釋放遠端物件。

對於 使用者介面自動化 用戶端,此 COM行為可能表示 32/64 協助程式(由 UIAutomationCore.dll 所建立的UIAutomationCore.dll所建立)的存留期是由建立元素之線程的 Apartment 存留期所控管。 如果 使用者介面自動化 用戶端將元素封送處理至另一個線程,當原始 Apartment 關閉時,元素可能會失效。 使用者介面自動化 客戶端應該在使用封送處理自動化元素時攔截錯誤,以正常處理這些問題。

32 位 使用者介面自動化 具有 64 位元素的用戶端可能會發生相同的問題。

概念:

取得 UI 自動化項目

訂閱 使用者介面自動化 事件

UI 自動化事件概觀

其他資源

OLE 線程模型的描述和工作