【问题标题】:c# wpf: wait for webbrowser to load the pagec# wpf: 等待浏览器加载页面
【发布时间】:2017-04-17 23:05:52
【问题描述】:

我有一个 wpf 程序,我想在其中添加一个 WebBrowser 控件

我搜索如何检查 WebBrowser 是否成功加载页面,代码如下:

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 上不起作用。如何转换?

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

【问题讨论】:

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

标签: c# wpf webbrowser-control


【解决方案1】:

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

WebBrowser 控件不提供您可以等待的任何异步 API 或 Task 属性。它只是引发一个事件,所以处理这个事件是你能做的最好的事情:

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

如果您只想等待“TimeOut”秒数让页面加载,例如可以使用在 LoadCompleted 事件处理程序中释放的 SemaphoreSlim:

    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...
            }
        }
    }

【讨论】:

    【解决方案2】:

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

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

    希望对你有帮助!

    【讨论】:

      【解决方案3】:

      这个帖子很旧,但以防万一其他人需要解决同样的问题,这对我有用。

      private async Task ButtonClickHandler(object sender, RoutedEventArgs args)
          {
              var urlList = new List<string>
              {
                  "https://www.google.com/",
                  "https://www.facebook.com/",
                  "https://www.youtube.com/"
              };
      
              await LoopUrlsAsync(urlList);
          }
      
          private async Task LoopUrlsAsync(List<string> urlList)
          {
              TaskCompletionSource<bool> tcsNavigation = null;
              TaskCompletionSource<bool> tcsDocument = null;
      
              //These event bindings can be separated out to other methods, but for simplicity I've left them here. 
              WebBrowser.Navigated += (s, e) =>
              {
                  tcsNavigation.SetResult(true);
              };
      
              WebBrowser.LoadCompleted += (s, e) =>
              {
                  //Put logic here for what you want to happen when the document is finished loading
                  tcsDocument.SetResult(true);
              };
      
              foreach (var url in urlList)
              {
                  tcsNavigation = new TaskCompletionSource<bool>();
                  tcsDocument = new TaskCompletionSource<bool>();
      
                  WebBrowser.Navigate(url);
      
                  await tcsNavigation.Task;
                  await tcsDocument.Task;
              }
          }
      

      【讨论】:

        猜你喜欢
        • 2013-05-19
        • 1970-01-01
        • 2011-10-13
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 2018-06-14
        • 2012-04-27
        • 2017-09-13
        相关资源
        最近更新 更多