【问题标题】:Poor performance of Microsoft UI Automation LibraryMicrosoft UI 自动化库性能不佳
【发布时间】:2017-12-14 23:53:54
【问题描述】:

我目前正在尝试使用 Microsoft UI 自动化库和 C# 来自动化 Windows 窗体应用程序,但我在性能方面存在很大问题。通过使用PropertyCondition 或遍历窗口的所有元素来识别单个元素需要很长时间(最多 4 分钟)。只要我有一个AutomationElement,一切都很好(例如GetCurrentPropertyValue 在 100 毫秒内做出反应)。

性能不佳仅适用于一个应用程序。我无法访问源代码,但如果需要更改或检查某些内容,我可以与负责的程序员交谈。据我所知,应用程序的某些事件(例如绘画)被覆盖了。应用程序的一个典型窗口包含大约 100 个元素,这些元素可以通过 FindAll 方法找到。

我还尝试了UI自动化库的COM接口,速度快了大约两倍,但这并不能真正解决问题。

有没有人知道如何解决这个问题或遇到过类似的行为?

【问题讨论】:

    标签: performance user-interface automation


    【解决方案1】:

    当我们仔细研究主循环时,我们找到了答案。在大多数情况下,Application.Run 用于启动主窗口并运行应用程序,但由于某种原因,使用了以下代码:

    [...]    
        MainForm.Show();
        while DoStop == false
        {
            System.Threading.Thread.Sleep(10);
            Application.DoEvents();
        }
    [...]
    

    由于 Microsoft UI 自动化库使用窗口消息,所有 System.Threading.Thread.Sleep(10);总结起来,让物体检测变得非常慢。如果使用 Application.Run,​​则不会发生这种情况。

    【讨论】:

    • 所以如果你理解正确的话,性能不佳基本上是与被测应用程序编写不良有关,而不是与 UI 自动化框架本身有关?
    • UI 上的这个 Thread.Sleep 代码是否对它使用了自动化?还是执行自动化的应用程序?顺便说一句,一个 4 岁的 SO 帖子在 2 天内获得前 2 个 cmets 的几率是多少?
    • @Tobias:使用 Thread.Sleep 编写代码的人完全是个傻瓜。遗憾的是,您的回答并没有帮助所有其他也观察到 UI 自动化非常慢的人。即使在自动化应用程序中没有那种愚蠢的编程错误,您也会发现 UIA 是一大堆废话。它有很多错误,缺少很多功能,它不是线程安全的,而且速度极慢。
    • 性能下降的解决方案是使用新的 IUIAutomationElement COM 接口(从 Windows 7 开始)在这里查看我的答案:stackoverflow.com/questions/41768046/…
    猜你喜欢
    • 1970-01-01
    • 2020-09-13
    • 2023-04-04
    • 1970-01-01
    • 1970-01-01
    • 2014-10-23
    • 2011-07-26
    • 1970-01-01
    • 2011-12-07
    相关资源
    最近更新 更多