【问题标题】:Pause program flow until WebBrowser loads a page暂停程序流程,直到 WebBrowser 加载页面
【发布时间】:2015-07-15 21:39:10
【问题描述】:

我不得不在 WPF 应用程序(.NET v4.0)中使用WebBrowser 控件连续加载几个页面,最简单的暂停方法是使用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();
 }  

【问题讨论】:

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


    【解决方案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);
    

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2012-01-05
      • 1970-01-01
      • 2017-10-27
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多