2014-01-14 31 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會以某種方式使用默認瀏覽器作爲備份。 –