UI 自动化线程处理问题

注意注意

本文档的目标读者是欲使用 System.Windows.Automation 命名空间中定义的托管 UI Automation类的 .NET Framework 开发人员。有关 UI Automation的最新信息,请参见 Windows Automation API: UI Automation(Windows 自动化 API:UI 自动化)。

由于 Microsoft UI Automation使用 Windows 消息的方式的问题,当客户端应用程序尝试在 UI 线程上与自己的 UI 交互时,可能会发生冲突。 这些冲突可能会导致运行速度非常慢,甚至导致应用程序停止响应。

如果客户端应用程序要与桌面上的所有元素(包括它自己的 UI)交互,则应当在一个单独的线程上完成所有的 UI Automation调用。 这包括查找元素(例如,通过使用 TreeWalkerFindAll 方法)和使用控件模式。

可以在 UI Automation事件处理程序中安全地调用 UI Automation,因为该事件处理程序始终在非 UI 线程上调用。 但是,如果订阅的事件源自客户端应用程序的 UI,则您必须在非 UI 线程上调用 AddAutomationEventHandler 或相关方法。 需要在同一个线程上移除事件处理程序。