Warning: file_get_contents(/data/phpspider/zhask/data//catemap/7/user-interface/2.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Performance Microsoft UI自动化库的性能不佳_Performance_User Interface_Automation - Fatal编程技术网

Performance Microsoft UI自动化库的性能不佳

Performance Microsoft UI自动化库的性能不佳,performance,user-interface,automation,Performance,User Interface,Automation,我目前正试图通过使用Microsoft UI自动化库和C#来自动化Windows窗体应用程序,但在性能方面存在很大问题。通过使用属性条件或迭代窗口的所有元素来识别单个元素需要很长时间(最多4分钟)。只要我有一个AutomationElement,一切都很好(例如GetCurrentPropertyValue在100ms内反应) 性能差仅适用于一个应用程序。我没有访问源代码的权限,但如果需要更改或检查某些内容,我可以与负责的程序员交谈。据我所知,应用程序中的某些事件(如绘制)被覆盖。应用程序的典型

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

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

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


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

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

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

由于MicrosoftUIAutomation库使用窗口消息,因此所有的System.Threading.Thread.Sleep(10);总结并使得目标检测变得非常缓慢。如果使用Application.Run,则不会发生这种情况。

因此,如果您理解正确,性能差基本上与测试中的应用程序编写不好有关,而不是与UI自动化框架本身有关?是不是UI上的线程.Sleep代码对其使用了自动化?还是执行自动化的应用程序?顺便说一句,一个4岁的SO帖子在两天内收到前两条评论的几率有多大?@Tobias:不管是谁用Thread.Sleep编写了这段代码,他都是个十足的傻瓜。遗憾的是,你的回答并不能帮助所有其他人,他们也注意到UI自动化非常缓慢。即使在自动化应用程序中没有这种愚蠢的编程错误,您也会发现UIA是一堆废话。它有很多错误,缺少很多功能,它不是线程安全的,而且速度非常慢。降低性能的解决方案是使用新的IUIAutomationeElement COM接口(自Windows 7以来)。请参见我的答案: