2016-12-02 96 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; 
} 

我希望它有幫助!