長年の読者、初めてのポスターはこちら。
私の目標は、WebBrowserクラスの使用中にasync/awaitを利用できるようにすることです。WebBrowser.Navigate(string url)は非同期メソッドであるため、LoadCompleteイベントが発生するまでhtmlドキュメントを調べることはできません。
これまでの私の(動作中の)コードは次のとおりです。
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();
}
}
そして、この前のクラスでは、次のものを使用できるようになりました。
public async void NavigateToGoogle() {
await browser.NavigateAsync("www.google.com");
//Do any necessary actions on google.com
}
しかし、これを処理するためのより効率的で適切な方法があるかどうか疑問に思っています。具体的には、ブロッキングManualResetEventを使用したTask.Factory.CreateNewです。ご入力いただきありがとうございます。