C# WebBrowser和Thread.Sleep oddity(启动默认浏览器而不是WebBrowser控件)

C# WebBrowser和Thread.Sleep oddity(启动默认浏览器而不是WebBrowser控件),c#,multithreading,webbrowser-control,thread-sleep,C#,Multithreading,Webbrowser Control,Thread Sleep,好的,目标是尝试检测网页何时更新,并在WebBrowser控件中显示更新的网页。比如说,我知道亚马逊今天会推出PlayStation4,但我不知道什么时候。我将Amazon PS4页面的地址放在我的表单中,程序会定期向该页面启动WebBrowser,并将HTML保存到字符串列表中。下次启动浏览器时,它会根据我的列表检查结果。如果列表已包含此特定字符串,则WebBrowser将关闭,我们将使用Thread.Sleep再次等待 private void Launch() { while (bln

好的,目标是尝试检测网页何时更新,并在WebBrowser控件中显示更新的网页。比如说,我知道亚马逊今天会推出PlayStation4,但我不知道什么时候。我将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中立即打开一个新选项卡

我很确定这是因为睡眠。虽然,在引入Thread.Sleep之前,我偶尔会看到这个问题,但从那时起,它已经增加了100倍


也许是线程。睡眠并不是最好的间隔方式。也许我完全错了。感谢您的任何建议。

首先,
线程.Sleep
不太可能与Firefox中加载的页面有关,而不是在
WebBrowser
控件中加载

Thread.Sleep
通常不是定期做事的最佳方式。你最好有个计时器。如果您使用的是Windows窗体,那就是。将
间隔设置为所需的任何延迟,并让
勾选事件更新浏览器

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


最后,您真的需要一个
WebBrowser
?您最好只使用下载HTML。

我并不需要每次通话都使用WebBrowser。我决定改为使用WebRequest,只在页面恢复为已更改时才启动WebBrowser。我以前尝试过这种方法,但在维护cookies/会话时遇到了一些问题。现在我把它放下,然后再回来,它似乎工作得更好了。不过我还是有点好奇为什么这些页面会被发送到Firefox。我在读Thread.Sleep,我的理论是,如果一个url在WebBrowser对象睡眠时被发送到该对象,windows会以某种方式使用默认浏览器作为备份。
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);
}