Моя цель: иметь возможность воспользоваться Async/ждать при использовании класса WebBrowser. Поскольку webbrowser.navigate (string url) является асинхронным методом, и вы не можете проверить документ HTML до тех пор, пока событие LoadComplete не будет запущено.
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();
}
}
< /code>
И этот предыдущий класс теперь позволяет мне использовать следующее: < /p>
public async void NavigateToGoogle() {
await browser.NavigateAsync("www.google.com");
//Do any necessary actions on google.com
}
Однако мне интересно, есть ли более эффективный/правильный способ обработки этого. В частности, task.factory.createNew с блокировкой ManualResetEvent .
Моя цель: иметь возможность воспользоваться Async/ждать при использовании класса WebBrowser. Поскольку webbrowser.navigate (string url) является асинхронным методом, и вы не можете проверить документ HTML до тех пор, пока событие LoadComplete не будет запущено.[code]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);
public void Navigate(string url) { m_WebBrowser.Navigate(new Uri(url)); }
void WebBrowser_LoadCompleted(object sender, NavigationEventArgs e) { m_MRE.Set(); } } < /code> И этот предыдущий класс теперь позволяет мне использовать следующее: < /p> public async void NavigateToGoogle() { await browser.NavigateAsync("www.google.com"); //Do any necessary actions on google.com } [/code] Однако мне интересно, есть ли более эффективный/правильный способ обработки этого. В частности, task.factory.createNew с блокировкой ManualResetEvent .