2014-01-14 33 views
0

好了,我们的目标是试图检测时,网页已更新,并在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不是隔开我的间隔的最佳方式。也许我只是想说这完全错了。任何建议表示赞赏。

回答

2

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

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

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

最后,你真的需要一个WebBrowser?使用WebClient.DownloadString下载HTML可能会更好。

+0

我并不需要每次调用都需要WebBrowser。我决定使用WebRequest,并且只在页面返回时发布WebBrowser。我之前尝试过这条路线,但在保持Cookie /会话时遇到了一些麻烦。似乎现在工作得更好,现在我已经把它放下来并回来了。 –

+0

仍然有点好奇,但为什么页面被发送到Firefox。我正在阅读Thread.Sleep,我的理论是,如果一个url在睡眠时发送到WebBrowser对象,那么windows会以某种方式使用默认浏览器作为备份。 –