我有以下兩種方法,我在序列(按順序適當一流水平場)調用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()非常快。不幸的是,我不適合我的應用程序。 –