好的,目标是尝试检测网页何时更新,并在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不是最好的间隔空间。也许我只是完全错了。任何建议都表示赞赏。
答案 0 :(得分:2)
首先,Thread.Sleep
与有时在Firefox中而不是在WebBrowser
控件中加载的页面有很大关系。
Thread.Sleep
通常不是定期执行操作的最佳方式。使用计时器你可能会更好。如果您使用的是Windows窗体,那就是System.Windows.Forms.Timer。将Interval
设置为您想要的任何延迟,并让Tick
事件更新浏览器。
我不确定你为什么每次都要创建一个新的WebBrowser
控件。似乎你最好只创建一次,然后调用Refresh
方法。
最后,你真的需要WebBrowser
吗?您最好只使用WebClient.DownloadString下载HTML。