我在使用GeckoFX時會遇到問題:如何在使用GeckoFX時處理線程 - 在嘗試在其他線程中使用GeckoWebBrowser時,它似乎會不斷拋出錯誤。在多線程應用程序中使用GeckoFX
特別是我在這個測試應用程序中試圖做的是生成一個網頁的縮略圖,並將其顯示在窗體上(而不是WebBrowser控件本身)。當工作單線程,它的偉大工程:
private void browser_DocumentCompleted(object sender, EventArgs e)
{
GeckoWebBrowser browser = sender as GeckoWebBrowser;
if (browser.Url.ToString() != "about:blank")
{
webBrowserReady = true;
}
}
private void btnGo_Click(object sender, EventArgs e)
{
Xpcom.Initialize();
GeckoWebBrowser browser = new GeckoWebBrowser();
browser.Width = 1600;
browser.Height = 1200;
browser.DocumentCompleted += new EventHandler(browser_DocumentCompleted);
webBrowserReady = false;
browser.CreateControl();
browser.Navigate(txtUrl.Text);
while (!webBrowserReady)
Application.DoEvents();
if (webBrowserReady)
DrawWebBrowserToImage(browser);
browser.Dispose();
}
但是,如果我移動瀏覽器創建和渲染成自己的線程,我得到一個COM錯誤,當我嘗試調用CreateControl():
Xpcom.Initialize();
Thread t = new Thread(new ThreadStart(()=>{
GeckoWebBrowser browser = new GeckoWebBrowser();
/* all the rest of the gecko stuff here too */
}
t.Start();
爲了解決這個問題,我可以移動Xpcom.Initialize呼叫到線程以及:
Thread t = new Thread(new ThreadStart(()=>{
Xpcom.Initialize();
GeckoWebBrowser browser = new GeckoWebBrowser();
/* all the rest of the gecko stuff here too */
}
t.Start();
這個偉大的工程......一次。第二次嘗試瀏覽時,DocumentCompleted只會被解僱一次(約:空白)。一段時間後,COM錯誤也會彈出。這似乎向我表明,調用Xpcom.Initialize(一個靜態方法只能在每個應用程序中調用一次,以後每次都不會執行任何操作)會將GeckoFX永久綁定到該特定線程。永遠。
有沒有辦法讓Xpcom和GeckoFX在多線程環境中正常工作?
你有沒有計算任何在這個問題上? – 2011-05-24 16:59:24
不......上下文是我在後臺線程中使用GeckoFX來生成網站的縮略圖,並且還使用GeckoFX作爲用戶界面中的實際瀏覽器。最後(不幸的是)在後臺線程中使用WebBrowser控件來生成縮略圖(而在UI中仍然使用GeckoFX)。 – MisterZimbu 2011-05-26 19:21:38
這很有趣...這正是我想要做的。不過,我通過IE9的WebBrowser控件取得了一些成功。 – 2011-05-27 17:18:16