好了,我们的目标是试图检测时,网页已更新,并在WebBrowser控件显示更新后的页面。例如,假设我知道亚马逊今天将推出Playstation 4,但我不知道何时。我把亚马逊PS4页面的地址放在我的表单中,程序定期启动一个到该页面的WebBrowser,并将HTML保存为一个字符串列表。下一次启动浏览器时,它会根据我的列表检查结果。如果列表已经包含这个特定的字符串,WebBrowser就会关闭,我们再次使用Thread.Sleep等待。web浏览器和Thread.sleep代码古怪(默认浏览器中启动,而不是WebBrowser控件)
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/web浏览器。我已经通过了,每次我离开Thread.Sleep时都会发生。
是OnDocumentComplete我的web浏览器当前的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不是隔开我的间隔的最佳方式。也许我只是想说这完全错了。任何建议表示赞赏。
我并不需要每次调用都需要WebBrowser。我决定使用WebRequest,并且只在页面返回时发布WebBrowser。我之前尝试过这条路线,但在保持Cookie /会话时遇到了一些麻烦。似乎现在工作得更好,现在我已经把它放下来并回来了。 –
仍然有点好奇,但为什么页面被发送到Firefox。我正在阅读Thread.Sleep,我的理论是,如果一个url在睡眠时发送到WebBrowser对象,那么windows会以某种方式使用默认浏览器作为备份。 –