Oczekiwanie do momentu pojawienia się określonego zdarzenia kontrolki

0

Witam,

Piszę niewielki program narzędziowy. Doszedłem do miejsca w którym muszę poczekać na załadowanie strony przez kontrolkę WebBrowser i dopiero wtedy wtedy mogę wykonywać kolejne zadania. Pierwszym pomysłem było najprostsze:

 
  webBrowser1.Navigate("...");

            while (!(webBrowser1.ReadyState == WebBrowserReadyState.Complete))
            {
                Application.DoEvents();
            }

//Tutaj kod który musi czekać na ładowanie

Ogólnie powyższe rozwiązanie woła o pomstę do nieba więc szukam czegoś bardziej poprawnego, eleganckiego i nieblokującego GUI.

Kontrolka WebBrowser dysponuje zdarzeniem *DocumentCompleted * które wydaje się być kluczem do rozwiązania, ale jak sprawić by po wykonaniu tego zdarzenia sterowanie wróciło w oczekiwane miejsce ?

Myślałem nad zastosowaniem async/await ale jakoś nie bardzo łączy się to z obsługą powyższego zdarzenia.

0

Ok może się komuś przyda. Pokopałem troch i znalazłem rozwiązanie:

Metoda rozszerzająca klasę WebBrowser która może być wywołana asynchronicznie poprzez await

 
 static class WebBrowserExtension
    {
        public static Task NavigateAsync(this WebBrowser WebBrowserClass,string URL)
        {
            TaskCompletionSource<int> tsc=new TaskCompletionSource<int>();

           WebBrowserDocumentCompletedEventHandler handler = null;
           handler =new WebBrowserDocumentCompletedEventHandler((s,e)=>
                {
                    WebBrowserClass.DocumentCompleted-=handler;
                    tsc.TrySetResult(0);

                });

           WebBrowserClass.DocumentCompleted += handler;
       
               WebBrowserClass.Navigate(URL);
         
           return tsc.Task;
        }

    }

I jej wywołanie:

  await webBrowser1.NavigateAsync("...");

1 użytkowników online, w tym zalogowanych: 0, gości: 1