暂停程序流,直到WebBrowser加载页面

时间:2015-07-15 21:39:11

标签: c# wpf c#-4.0 webbrowser-control

我必须在带有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();
 }  

1 个答案:

答案 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);