Długoletni czytelnik, pierwszy plakat tutaj.Async/Oczekiwanie na implementację klasy WebBrowser dla .NET
Mój cel: Aby móc skorzystać z asynchronizacji/poczekać, korzystając z klasy WebBrowser. Ponieważ WebBrowser.Navigate (adres URL łańcucha) jest metodą asynchroniczną i nie można badać dokumentu HTML do momentu uruchomienia zdarzenia LoadComplete.
Oto moje (pracy) kod do tej pory:
public class AsyncWebBrowser
{
protected WebBrowser m_WebBrowser;
private ManualResetEvent m_MRE = new ManualResetEvent(false);
public void SetBrowser(WebBrowser browser) {
this.m_WebBrowser = browser;
browser.LoadCompleted += new LoadCompletedEventHandler(WebBrowser_LoadCompleted);
}
public Task NavigateAsync(string url) {
Navigate(url);
return Task.Factory.StartNew((Action)(() => {
m_MRE.WaitOne();
m_MRE.Reset();
}));
}
public void Navigate(string url) {
m_WebBrowser.Navigate(new Uri(url));
}
void WebBrowser_LoadCompleted(object sender, NavigationEventArgs e) {
m_MRE.Set();
}
}
A ta poprzednia klasa teraz pozwala mi korzystać następujące:
public async void NavigateToGoogle() {
await browser.NavigateAsync("www.google.com");
//Do any necessary actions on google.com
}
Jednak zastanawiam się, czy jest więcej skuteczny/właściwy sposób radzenia sobie z tym. W szczególności Task.Factory.CreateNew z blokowaniem ManualResetEvent. Dzięki za wkład!
Masz rację, spędziłem dość dużo czasu, aby zwrócić to zadanie poprawnie, a wtedy mogłem poczekać. Ha ha. Będę się bawił z tą sugestią i sprawdzę, czy coś wymyślę. Dzięki! –
Sean S, czy masz już dobre rozwiązanie? – Blaise