好了,我們的目標是試圖檢測時,網頁已更新,並在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會以某種方式使用默認瀏覽器作爲備份。 –