2010-11-05 68 views
1

我正在使用BrowserControl導航到網站上的網頁範圍,然後解析HTML並提取有關書籍等的信息......我遇到了與線程相關的問題(我認爲)...如何爲WebBrowser控件處理線程

我有這樣的事情。

// MAIN LOOP 
for (int i = 0; i < NumberOfPages; i++) 
{ 
    WebBrowser.Navigate("http://AWebSite/" + NumberOfPages.ToString()); 
} 

// HANDLE ON_LOADED EVENT 
void WebBrowser_LoadCompleted(object sender, NavigationEventArgs e) 
    { 
    // Retrieve HTMLDocument, Parse it etc 
    } 

現在,因爲它需要幾秒鐘的事件,火災控制導航到一個頁面後,我有兩個選擇之一:

OPTION1 等待幾秒鐘,在我的主循環,像這樣的:

for (int i = 0; i < NumberOfPages; i++) 
{ 
    WebBrowser.Navigate("http://www.mysite.com"); 

// wait for 5 seconds 
DateTime wait = new DateTime(); 
while (new DateTime().Ticks < wait.Ticks + 5000) 
    { 
    // not sure if I need do events here   
    } 
} 

OPTION2 另一個想法是一個全局變量爲(布爾)標記,告知事件處理程序的頁面仍然在下載(該標誌設置爲繁忙的主要外觀,然後復位然後在重置後重置處理返回的html)。

我有一種感覺這兩種方法都是笨拙的,真正有一個更好的辦法就是以某種方式處理這兩件事情(在不同的線程上運行?)

回答

0

您可以通過misuing迭代器做到這一點,因爲我描述爲here

例如:

interface IAction { void Execute(Action callback); } 

public static void ExecAction(IEnumerator<IAction> enumerator) { 
    if (enumerator.MoveNext()) 
     enumerator.Current.Execute(() => ExecAction(enumerator)); 
} 

class WaitForLoad : IAction { 
    void IAction.Execute(Action callback) { 
     //Handle the LoadCompleted event and call callback 
    } 
} 

IEnumerator<IAction> YourMethod() { 
    ... 
    for (int i = 0; i < NumberOfPages; i++) { 
     WebBrowser.Navigate("http://AWebSite/" + NumberOfPages.ToString()); 
     yield return new WaitForLoad(); 
    } 
    ... 
} 

你可以讓這個更復雜的具有WaitForLoad檢查正確的頁面加載。

+0

謝謝,試圖通讀你的例子,但它看起來高於我的頭:-(有沒有更簡單的方法來做到這一點,因爲我不介意一次只提取一個url? – underwater 2010-11-06 17:29:57

1

是的,延遲很笨拙 - 它可能需要比這更長或更長的時間。

你需要WebBrowser控件嗎?看起來你正在做一些批處理。如果是這樣,System.Net.WebClient可能會爲你工作。它具有阻塞和異步方法 - .DownloadData和.DoanloadDataAsync。

如果你需要它,我可以挖掘一些代碼,但是快速搜索會顯示一些例子。

+0

您好邁克,任何機會張貼一個簡單的例子如何迭代通過多個導航到多個網址和管理來處理返回的HTML? – underwater 2010-11-06 17:25:48

+0

讓我給你一個代碼示例的鏈接 - 不是在我的開發箱 - http: //msdn.microsoft.com/en-us/library/xz398a3f.aspx。如果你願意,你可以把它放在一個像你原來的帖子一樣的循環中。如果你有問題,請告訴我們。 – 2010-11-07 19:34:03