2016-12-02 226 views
1

我有,我想添加一个WebBrowser控件C#WPF:等待网页浏览器加载页面

我搜索如何检查web浏览器加载页面成功与否,这里是代码中的WPF程序:

private async Task PageLoad(int TimeOut) 
{ 
    TaskCompletionSource<bool> PageLoaded = null; 
    PageLoaded = new TaskCompletionSource<bool>(); 
    int TimeElapsed = 0; 
    webBrowser.LoadCompleted += (s, e) => 
    { 
     if (webBrowser.ReadyState != webBrowser.Complete) return; 
     if (webBrowser.Task.IsCompleted) return; 
     PageLoaded.SetResult(true); 
    }; 

    while (PageLoaded.Task.Status != TaskStatus.RanToCompletion) 
    { 
     //interval of 10 ms worked good for me 
     await Task.Delay(10); 
     TimeElapsed++; 
     if (TimeElapsed >= TimeOut * 100) 
     { 
      //This prevents your method or thread from waiting forever 
      PageLoaded.TrySetResult(true); 
     } 
    } 
} 

但是,为什么它不适用于wpf。我如何转换它?

我检查了它并且ReadyStateCompleteTask.IsCompleted在wpf中没有这样的属性。什么是wpf的代码?

+0

[.NET的WebBrowser类的异步/等待实现]的可能重复(http://stackoverflow.com/questions/8610197/async-await-implementation-of-webbrowser-class-for-net) –

+0

检查该网页加载是一个可疑的事情。网页浏览器控件和IE都可以让你连接到document.complete事件。但当然问题是,许多javascript框架也只有在文档加载完成后才开始加载。因此,您可以触发document.complete事件,但仍可以运行脚本,以动态方式添加更多网页。 –

回答

2

您可以只处理WebBrowser控件的LoadCompleted事件。当导航到的网页已完成下载时,将引发此事件:https://msdn.microsoft.com/en-us/library/system.windows.controls.webbrowser.loadcompleted(v=vs.110).aspx

WebBrowser控件未提供任何可等待的异步API或任务属性。它只是引发一个事件,以便处理该事件的是你能做到真正的最好的事情:

webBrowser.LoadCompleted += (s, e) => 
{ 
    //the page has been loaded here. Do your thing... 
}; 

如果你只是想等待“超时”的秒数,以得到加载例如,你可以使用SemaphoreSlim页面您发布在LoadCompleted事件处理程序中:

private async Task LoadPageAsync(string url, int timeOutInSeconds) 
    { 
     using (System.Threading.SemaphoreSlim semaphore = new System.Threading.SemaphoreSlim(0, 1)) 
     { 
      bool loaded = false; 
      webBrowser.LoadCompleted += (s, e) => 
      { 
       semaphore.Release(); 
       loaded = true; 
      }; 
      webBrowser.Navigate(url); 

      await semaphore.WaitAsync(TimeSpan.FromSeconds(timeOutInSeconds)); 

      if (loaded) 
      { 
       //page was loaded 
      } 
      else 
      { 
       //page was not loaded... 
      } 
     } 
    } 
0

我一直在尝试几乎所有建议的解决方案。这是解决我的问题的那个。在尝试与页面交互之前调用此方法:

public void CheckWebBrowser() 
{ 
     while (wb.IsBusy || wb.ReadyState != WebBrowserReadyState.Complete) 
      { 
       Application.DoEvents(); 
      } 
     return; 
} 

我希望它有帮助!