2010-03-22 133 views
6

是否有可能/建議在Web瀏覽器控件中使用後臺工作線程?BackgroundWorker和WebBrowser控件

我正在創建一個搜索谷歌關鍵字的機器人,然後檢查前10個網頁中的網站以查看網站是否排名。

用戶最多可以提供20個站點進行檢查,並可以使用代理服務器。所以理想情況下,我想一次有5個線程工作。

可能嗎?我可能聽說過WebBrowser控件和線程有問題。

回答

15

不是。 WebBrowser使用Internet Explorer,它是一個COM組件。 COM組件具有線程模型,IE使用「Apartment」。這是一個昂貴的詞,意味着它不是線程安全的。您可以在BGW中調用它的方法,但COM會自動將調用封送到UI線程。由於所有方法調用和屬性訪問實際上都是在UI線程上發生的,因此您可以通過使用BGW將其設置爲較慢的

事實上,您可以在另一個線程上運行WebBrowser,您必須在該線程上創建它的一個實例。你將不得不創建一個所謂的單線程公寓。 STA,您可以從Winforms或WPF應用程序的Main()方法的[STAThread]屬性中識別出的首字母縮寫詞。將工作線程更改爲STA需要在啓動之前調用Thread.SetApartmentState()。你不能爲BGW做這個。線程必須抽取消息循環來實現STA合同,它必須調用Application.Run()。例如,要求WebBrowser提高其事件。 This answer顯示了該方法。

考慮使用WebRequest類。

+3

+1這不是'! – 2010-03-22 11:46:47

+2

我在我的搜索中遇到了這個答案,在UI線程中是否可以使用WebBrowser.Navigate()而不是**。我從你的問題的理解是,這是可能的,但它並不重要,因爲所有這些調用無論如何都封送到UI線程。我是否理解正確? – 2012-10-23 22:15:05

1

是否有任何理由使用IE控件來控制庫,如HTML Agility pack?這已經支持多線程而沒有IE的COM噩夢,並且使用HTML解析功能更強大。

+2

該機器人還做關鍵字研究,並使用一些谷歌其他工具。 Google對bot請求非常嚴格,所以使用IE比使用HttpWebRequest更容易管理。 – 2010-03-22 10:10:34

+3

我想知道他們是否有使用瀏覽器的機器人策略。 – 2010-03-22 10:24:02

+0

@HenkHolterman他們有任何可能傷害他們的服務和利潤的政策。 – 2012-10-23 22:05:00

1

要回答你的直接問題:我從來沒有嘗試過,但如果出現問題,我不會感到驚訝。一般而言,WinForms控件不打算從除主UI線程以外的線程訪問。您應該使用Control.Invoke()方法從其他線程運行調用方法。這將它們排列在主UI線程上。

要解決更廣泛的問題:如果您不需要實際呈現HTML以供用戶查看,則最好不要使用WebBrowser控件。您可以使用HttpWebRequest類下載一個頁面,該頁面要輕得多。 WebBrowser基本上是嵌入在應用程序中的全功能Internet Explorer。