2016-03-17 17 views
17

I die folgenden zwei Verfahren, die ich in der Folge (in der Folge mit entsprechenden Klassenstufe Feld) nennenApplication.GetWindow() * * sehr langsam

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 
} 

Wenn ich es laufen, eine der Anruf zu App.GetWindow() dauert Wirklich lange Zeit. Wie mehr als eine Minute. Die Anwendung und das Fenster sind beide geöffnet und ausgeführt.

Ich habe versucht, mit den Überladungen von GetWindow() zu experimentieren und versuchte auch Anrufe zu Application.GetWindows() und Application.Find(), aber mit dem gleichen Ergebnis.

Hat jemand irgendwelche Gedanken darüber, wie ich diese Zeit reduzieren oder zumindest genau bestimmen könnte, was so lange dauert? Ich bin nicht mit der Implementierung, die ich in irgendeiner Weise habe verheiratet - was auch immer mich dieses Fenster Objekt ist in Ordnung mit mir.

Update:

die Kommentare zu adressieren so weit geändert ich den Code zu versuchen, so viele andere Probleme wie möglich zu beseitigen.

Ich warf die aufzählbare Auswertung, um jede verzögerte Ausführung zu entfernen. Und ich habe es sowohl mit meiner App als auch mit meinem Notizblock ausprobiert. Der obige Code führt sowohl für meine App als auch für den Editor die ersten drei Zeilen sofort im Debugger aus und benötigt dann in beiden Fällen zu viel Zeit für die letzte Zeile.

(Es scheint möglich, dass Weiß intern Application.Attach defer Ausführung könnte, aber ich weiß nicht sehr viel über dieses Tool, so dass ich sehr undurchsichtig ist.)

Zweite Update:

Hier die Aufschlüsselung der Zeit in der GetWindow() -Methode verbrachte. Die App verbrachte ungefähr 10% der Zeit in GetWindow(), so dass mehr als die Hälfte dieser Zeit in WaitTillFound() und fast alles in einer Retry() -Methode verbracht wurde. Irgendwelche Gedanken darüber, wie man diese Zeit reduzieren kann (oder um die Zeit zu reduzieren, die im Window-Konstruktor verbracht wurde, nachdem sie gefunden wurde)? Diagnostics

+1

Was heißt Starten? Sind Sie sicher, dass die App den Aufruf von Launch nicht verzögert, bis Sie GetWindow aufrufen - der von Ihnen bereitgestellte Code zeigt nicht wie, aber der einzige Teil, der langsam ausgeführt werden sollte, ist Ihre LINQ-Abfrage aller laufenden Prozesse, um den enthaltenen zu finden der angegebene Text, der die Abfrage von Informationen für jeden laufenden Prozess auf Ihrem Computer erfordert. Ich kann es nicht an dem Code erkennen, vielleicht verwenden Sie irgendwo hazard/async und es ruft Launch nicht auf, bis der Wert für App aufgelöst ist? –

+2

Haben Sie es mit einer anderen Anwendung versucht? Wenn ich den Code mit 'ProcessName =" notepad "' und 'WindowTitle =" Untitled - Notepad "' starte, wird das Fenster fast augenblicklich angezeigt. –

+0

Ich dachte, es wäre einfacher, den Beitrag mit meinen Antworten hier zu aktualisieren.Es scheint mir komisch, dass es eine lange Zeit dauert, um den Editor anzuhängen. Wenn ich Application.Launch() verwende, ist GetWindow() auch sehr schnell. Leider ist das bei meiner Bewerbung keine Option. –

Antwort

1

Es ist nicht klar, ob das Zielfenster tatsächlich nach diesem Warten gefunden wird. Wenn ja - das ist in der Tat sehr merkwürdig. Wie auch immer, wenn Sie GetWindow aufrufen, wird White versuchen, dieses Fenster für einen bestimmten Zeitraum zu finden, standardmäßig 30 Sekunden (mit Intervallen von 200ms). Das ist wahrscheinlich das, was Sie erleben - Weiß kann aus irgendeinem Grund kein Fenster finden, auf das Sie zielen. Sie können diese Zeitüberschreitung konfigurieren über:

Wo mit 0 wird es sofort fehlschlagen, wenn Fenster nicht gefunden werden kann. Sie können auch einen anderen Wert als 30 Sekunden verwenden.

+0

Dieses Timeout-Bit ist eine Hilfe und wird definitiv damit spielen, wenn ich wieder auf meinem Entwicklungscomputer bin. FWIW, es findet schließlich das Fenster. Ich bin jedoch daran interessiert zu sehen, ob es nicht dazu führt, dass das Timeout nach unten rutscht. –