2016-03-17 17 views
17

mam następujące dwie metody, które nazywam w sekwencji (z odpowiednim polu poziomie klasy w sekwencji)Application.GetWindow() * bardzo * powolna

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 
} 

Kiedy go uruchomić, wezwanie do App.GetWindow() trwa NAPRAWDĘ długi czas. Jak ponad minutę. Aplikacja i okno są otwarte i działają.

Próbowałem eksperymentować z przeciążeniami GetWindow(), a także próbowałem połączeń z Application.GetWindows() i Application.Find(), ale z tym samym wynikiem.

Czy ktoś ma jakieś przemyślenia na temat tego, w jaki sposób mogę ograniczyć ten czas, lub przynajmniej wskazać, co zajmuje tak długo? Nie jestem żonaty z realizacją, którą mam w każdym odcinku - cokolwiek przyniesie mi ten obiekt okna, jest w porządku ze mną.

Aktualizacja:

Aby rozwiązać komentarze do tej pory, że zmodyfikowany kod, aby spróbować wyeliminować jak wiele innych problemów, jak to możliwe.

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"); 
} 

wrzuciłem w ocenie przeliczalnego aby wyeliminować wykonywanie odroczony jak również. Próbowałem go zarówno z aplikacją, jak i notatnikiem. Powyższy kod, zarówno dla mojej aplikacji, jak i notatnika, wykonuje pierwsze 3 wiersze bezpośrednio w debugerze, a następnie zajmuje zbyt długi czas na ostatnim w obu przypadkach.

(Wydaje się możliwe, że Biały może wewnętrznie odroczyć wykonanie Application.Attach, ale nie wiem bardzo dużo na temat tego narzędzia, dzięki czemu jest bardzo nieprzejrzysty do mnie.)

Druga aktualizacja:

Oto Podział czasu spędzonego w metodzie GetWindow(). Aplikacja zużywała około 10% czasu w GetWindow(), więc ponad połowa tego czasu jest spędzana w funkcji WaitTillFound() i prawie wszystko w metodzie Retry(). Wszelkie przemyślenia dotyczące skrócenia tego czasu (lub skrócenia czasu spędzonego w konstruktorze okien po znalezieniu)? Diagnostics

+1

Co wywołuje uruchomienie? Czy na pewno aplikacja nie opóźnia wywołania funkcji Uruchom, dopóki nie wywołasz funkcji GetWindow - podany kod nie pokazuje sposobu, ale jedyną częścią, która powinna działać wolno, jest zapytanie LINQ wszystkich uruchomionych procesów w celu znalezienia tego, który zawiera określony tekst, który będzie wymagał informacji o zapytaniach dla każdego uruchomionego procesu na twoim komputerze. Nie mogę powiedzieć z kodu, być może używasz gdzieś opcji oczekuj/asynchronicznej i nie wywołuje ona polecenia Uruchom, dopóki wartość dla aplikacji nie zostanie rozwiązana? –

+2

Czy próbowałeś już z inną aplikacją? Kiedy uruchamiam twój kod przy pomocy 'ProcessName =" notepad "' i 'WindowTitle =" Untitled - Notepad "', to zwraca okno prawie natychmiast. –

+0

Uznałem, że łatwiej będzie zaktualizować wpis dzięki moim odpowiedziom tutaj.Wydaje mi się dziwne, że dołączenie do Notatnika zajmuje dużo czasu. Ponadto, jeśli używam Application.Launch(), GetWindow() jest bardzo szybki. Niestety, nie jest to opcja z moją aplikacją. –

Odpowiedz

1

Nie jest jasne, czy okno docelowe faktycznie znajduje się po tym oczekiwaniu. Jeśli tak, to naprawdę dziwne zachowanie. W każdym razie, gdy wywołasz GetWindow, White spróbuje znaleźć to okno przez pewien czas, domyślnie 30 sekund (z przerwami 200 ms). Najprawdopodobniej tak właśnie jest - biały z jakiegoś powodu nie może znaleźć okna, na które celujesz. Można skonfigurować ten limit czasu poprzez:

TestStack.White.Configuration.CoreAppXmlConfiguration.Instance.FindWindowTimeout = 0; 

Gdzie gdzie 0 to nie natychmiast, jeśli okna nie można znaleźć. Możesz także użyć innej wartości niższej niż 30 sekund.

+0

Ten bit Timeout jest pomocny i na pewno będzie z nim grać, gdy ponownie znajdę się na mojej maszynie programistycznej. FWIW, to ostatecznie znajdzie okno. Będę jednak zainteresowany, jeśli cofnięcie limitu czasu spowoduje, że nie. –

Powiązane problemy