UI 自动化线程处理问题

备注

本文档适用于想要使用 System.Windows.Automation 命名空间中定义的托管 UI 自动化类的 .NET Framework 开发人员。 有关 UI 自动化的最新信息,请参阅 Windows 自动化 API:UI 自动化

由于 Microsoft UI 自动化使用 Windows 消息的方式,当客户端应用程序尝试在 UI 线程上与自己的 UI 进行交互时,可能发生冲突。 这些冲突可导致执行极其缓慢或者甚至会导致应用程序停止响应。

如果客户端应用程序旨在与桌面上的所有元素(包括自己的 UI)进行交互,则应在单独线程上调用所有的 UI 自动化。 这包括查找元素(例如,通过使用 TreeWalkerFindAll 方法)和使用控件模式。

在 UI 自动化事件处理程序内调用 UI 自动化是安全的,因为事件处理程序始终在非 UI 线程上调用。 但是,当订阅可能来源于客户端应用程序的 UI 的事件时,必须在非 UI 线程上调用 AddAutomationEventHandler 或相关方法。 删除同一线程上的事件处理程序。