WebBrowser和Thread.Sleep奇怪(默认浏览器启动而不是WebBrowser控件)

时间:2014-01-14 09:55:46

标签: c# multithreading webbrowser-control thread-sleep

好的,目标是尝试检测网页何时更新,并在WebBrowser控件中显示更新的页面。例如,据说我知道亚马逊今天会推出Playstation 4,但我不知道何时推出。我将Amazon PS4页面的地址放在我的表单中,程序会定期向该页面启动WebBrowser并将HTML保存到字符串列表中。下次启动浏览器时,它会根据我的列表检查结果。如果列表已包含此特定字符串,则WebBrowser将关闭,我们将使用Thread.Sleep再次等待。

private void Launch()
{
  while (blnWorking)
  {
    if (intWindowCount < intMaxCount)
    {
      ShowBrowserUri(GetBrowserUri());
    }

    if (intWait > 0)
      Thread.Sleep(intWait);
  }
}

delegate void ShowBrowserUriDelegate(Uri uri);

private void ShowBrowserUri(Uri uri)
{
  if (InvokeRequired)
  {
    ShowBrowserUriDelegate del = new ShowBrowserUriDelegate(ShowBrowserUri);
    Invoke(del, uri);
  }
  else
  {
    CookieContainer cc = GetUriCookieContainer(uri);
    CookieCollection cc1 = new CookieCollection();

    if (cc != null)
    {
      cc1 = cc.GetCookies(uri);
    }

    THBrowser thb = new THBrowser(uri, cc1, this); //THBrowser is a form with a WebBrowser control
    //THBrowser calls the Navigate method of its WebBrowser control

    intWindowCount++;
    thb.Show();
    thb.SendToBack();
  }
}

问题是,我的程序似乎是在Firefox(我的默认浏览器)中随机打开网站,而不是使用THBrowser / WebBrowser。我已经介入了,每当我走出Thread.Sleep时似乎都会发生。

我的WebBrowser的OnDocumentComplete可以将当前HTML与我的HTML字符串列表进行比较,如果页面内容已经包含在我的列表中,则关闭控件。

我面前没有最新版本,但那部分类似......

void webBrowser1_DocumentCompleted(object sender, WebBrowserDocumentCompletedEventArgs e)
{
  if (e.Url.AbsolutePath != (sender as WebBrowser).Url.AbsolutePath)
    return;

  if (ResultsList.Contains(this.webBrowser1.Document.Body.InnerHtml)
    this.Close();
  else
    ResultsList.Add(this.webBrowser1.Document.Body.InnerHtml);
}

我认为这可能是相关的,因为THBrowser短暂打开,消失,然后在Firefox中立即打开一个新标签。

我很确定Thread.Sleep与它有关。虽然,我在介绍Thread.Sleep之前偶尔会看到这个问题,但是从那以后它已经增加了100倍。

也许Thread.Sleep不是最好的间隔空间。也许我只是完全错了。任何建议都表示赞赏。

1 个答案:

答案 0 :(得分:2)

首先,Thread.Sleep与有时在Firefox中而不是在WebBrowser控件中加载的页面有很大关系。

Thread.Sleep通常不是定期执行操作的最佳方式。使用计时器你可能会更好。如果您使用的是Windows窗体,那就是System.Windows.Forms.Timer。将Interval设置为您想要的任何延迟,并让Tick事件更新浏览器。

我不确定你为什么每次都要创建一个新的WebBrowser控件。似乎你最好只创建一次,然后调用Refresh方法。

最后,你真的需要WebBrowser吗?您最好只使用WebClient.DownloadString下载HTML。