我必须在带有WebBrowser
控件的WPF应用程序(.NET v4.0)中连续加载几页,最简单的暂停方法是使用while循环并检查IsLoaded
属性。我想知道是否有更好的东西。以下SO响应建议使用AutoResetEvent
,但它似乎无法正常工作,即LoadCompleted
事件未被触发且AutoResetEvent
永远不会被设置。有没有我错过的东西
private Uri firstURI = new Uri("http://google.com", UriKind.RelativeOrAbsolute);
private Uri secondURI = new Uri("http://duckduckgo.com/", UriKind.RelativeOrAbsolute);
AutoResetEvent logEvent = new AutoResetEvent(false);
public MainWindow()
{
InitializeComponent();
webBrowser.Loaded += webBrowser_Loaded;
webBrowser.LoadCompleted += webBrowser_LoadCompleted;
webBrowser.Navigate(firstURI);
while(webBrowser.IsLoaded()){}; //logEvent.WaitOne();
webBrowser.Navigate(secondURI);
while(webBrowser.IsLoaded()){}; //logEvent.WaitOne();
// do something
}
void webBrowser_Loaded(object sender, RoutedEventArgs e)
{
logEvent.Set();
}
void webBrowser_LoadCompleted(object sender, NavigationEventArgs e)
{
logEvent.Set();
}
答案 0 :(得分:1)
您正在使用logEvent.WaitOne()
阻止UI线程,因此永远不会触发 LoadCompleted 事件(将在UI线程上下文中执行)。
我会写一个像
这样的异步扩展方法public static class MyExtensions
{
public static Task NavigateAsync(this WebBrowser browser, Uri uri)
{
var tcs = new TaskCompletionSource<object>();
LoadCompletedEventHandler loadCompleted = null;
loadCompleted = (s, e) =>
{
browser.LoadCompleted -= loadCompleted;
tcs.SetResult(e.WebResponse);
};
browser.LoadCompleted += loadCompleted;
browser.Navigate(uri);
return tcs.Task;
}
}
并像
一样使用它await webBrowser.NavigateAsync(firstURI);
await webBrowser.NavigateAsync(secondURI);