Lector de larga duración, primer póster aquí.Async/Espera la implementación de la clase WebBrowser para .NET
Mi objetivo: poder aprovechar async/await mientras utilizo la clase WebBrowser. Como WebBrowser.Navigate (url de cadena) es un método asíncrono, y no puede examinar el documento html hasta que se active el evento LoadComplete.
Aquí está mi código (de trabajo) hasta el momento:
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();
}
}
Y esta clase anterior ahora me permite utilizar lo siguiente:
public async void NavigateToGoogle() {
await browser.NavigateAsync("www.google.com");
//Do any necessary actions on google.com
}
Sin embargo, me pregunto si hay una mayor manera eficiente/adecuada de manejar esto. Específicamente, Task.Factory.CreateNew con el bloqueo ManualResetEvent. ¡Gracias por tu contribución!
Tiene toda la razón, había pasado bastante tiempo para que devolviera una Tarea correctamente que podría esperar. Jaja. Voy a jugar con esta sugerencia y ver si puedo encontrar algo. ¡Gracias! –
Sean S, ¿ya has encontrado una buena solución? – Blaise