我有以下两个方法,按顺序调用(使用适当的类级别字段)
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");
}
我加入了可枚举的评估,以消除任何延迟执行。并且,我尝试了一下我的应用程序和记事本。对于我的应用程序和记事本来说,上面的代码在调试器中立即执行前三行,然后在两种情况下最后一行话费了过多的时间。
(似乎 White 内部可能会延迟执行 Application.Attach
,但我对这个工具了解不多,所以对我来说非常不透明。)
第二次更新:
以下是 GetWindow() 方法中花费时间的详细分析。应用程序在 GetWindow() 中花费约 10% 的时间,因此其中超过一半的时间都花费在 WaitTillFound() 中,几乎全部在 Retry() 方法中。有什么想法可以减少这个时间(或者在找到 Window 后减少构造函数中花费的时间)吗?
ProcessName = "notepad"
和WindowTitle = "Untitled - Notepad"
运行你的代码时,它几乎瞬间返回窗口。 - Yusuf Tarık Günaydın