好的,目标是尝试检测网页何时更新,并在WebBrowser控件中显示更新后的页面。例如,假设我知道亚马逊将在今天推出PlayStation4,但我不知道什么时候。我在表单中输入了Amazon页面的地址,程序会定期启动指向该页面的WebBrowser并将其保存到字符串列表中。下一次,当它启动浏览器时,它会根据我的列表检查结果。如果列表已经包含此特定字符串,则关闭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将当前的超文本标记语言与我的超文本标记语言字符串列表进行比较,如果页面内容已经包含在我的列表中,则关闭控件。
我面前没有最新的版本,但这部分类似于...
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会短暂地打开,消失,然后在火狐中立即打开一个新的标签。
我很确定Thread.Sleep跟这件事有关。虽然,在引入Thread.Sleep之前,我偶尔会遇到这个问题,但自那以来,它已经增加了100倍。
也许Thread.Sleep不是间隔时间间隔的最佳方式。也许我这样做是完全错误的。如有任何建议,欢迎光临。
发布于 2014-01-14 23:26:11
首先,Thread.Sleep不太可能与有时加载到Firefox中的页面有关,而不是与WebBrowser控件有关。
Thread.Sleep通常不是定期做事情的最佳方式。你最好带上计时器。如果你使用的是Windows Forms,那就是System.Windows.Forms.Timer。将Interval设置为所需的任何延迟,并让Tick事件更新浏览器。
我不明白为什么每次都要创建一个新的WebBrowser控件。看起来你最好只创建一次,然后调用Refresh方法。
最后,你真的需要WebBrowser吗?使用WebClient.DownloadString下载HTML会更好。
https://stackoverflow.com/questions/21110467
复制相似问题