我有以下两种方法,我在序列(按顺序适当一流水平场)调用Application.GetWindow()*非常*慢
public const string ProcessName = "This is"
public const string WindowTitle = "somewhat proprietary."
public Application App { get; set; }
public void Launch()
{
var theProcess = Process.GetProcesses().First(p => p.ProcessName.Contains(ProcessName))
App = Application.Attach(theProcess);
}
public void Select()
{
var window = App.GetWindow(WindowTitle);
var textBox = window.Get<TextBox>();
//etc, do more stuff in the window
}
当我运行它,调用App.GetWindow()
需要真的很长时间。不止一分钟。应用程序和窗口都已打开并正在运行。
我试过试过GetWindow()
的过载,也试过拨打电话Application.GetWindows()
和Application.Find()
,但是结果相同。
有没有人有任何想法可以减少这个时间,或至少查明什么花了这么久?我没有结婚,我的任何延伸的实施 - 不管是什么让我的窗口对象罚款与我。
更新:
为了解决这个评论到目前为止,我修改了代码,以尽力消除许多其他问题成为可能。
public void Select()
{
var processes = Process.GetProcesses().ToList();
var process = processes.First(p => p.ProcessName.ToLower().Contains("notepad"));
App = Application.Attach(process);
var window = App.GetWindow("Untitled - Notepad");
}
我抛出了可枚举的评估,以消除任何推迟执行以及。而且,我用我的应用程序和记事本尝试了它。上面的代码,对于我的应用程序和记事本,立即在调试器中执行前3行,然后在这两种情况下最后一行花费过多时间。
(看来有可能是白色可能会在内部推迟执行Application.Attach
,但我不知道非常关注这个工具,所以这是非常不透明的我。)
第二次更新:
这里的GetWindow()方法花费的时间细分。该应用程序在GetWindow()中花费了大约10%的时间,因此超过一半的时间花费在WaitTillFound()中,几乎所有的时间都在Retry()方法中。关于如何减少这个时间的任何想法(或者减少在Window构造函数找到之后花费的时间)?
什么叫启动?你确定这个应用程序没有延迟Launch的调用,直到你调用GetWindow--你提供的代码没有显示如何,但唯一应该运行缓慢的部分是你所有正在运行的进程的LINQ查询,以查找包含指定的文本,这将需要查询您的机器上每个正在运行的进程的信息。我无法从代码中知道,也许你在某处使用await/async,并且在应用程序的值解决之前它不会调用Launch。 –
你有没有尝试过与另一个应用程序?当我用'ProcessName =“notepad”'和'WindowTitle =“Untitled - Notepad”'运行你的代码时,它几乎立即返回窗口。 –
我觉得用这里的回复更新帖子会更容易。对我来说,看起来很奇怪,它需要很长时间才能连接到记事本。另外,如果我使用Application.Launch(),GetWindow()非常快。不幸的是,我不适合我的应用程序。 –