2011-03-30 38 views
1

我在使用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在多線程環境中正常工作?

+0

你有沒有計算任何在這個問題上? – 2011-05-24 16:59:24

+0

不......上下文是我在後臺線程中使用GeckoFX來生成網站的縮略圖,並且還使用GeckoFX作爲用戶界面中的實際瀏覽器。最後(不幸的是)在後臺線程中使用WebBrowser控件來生成縮略圖(而在UI中仍然使用GeckoFX)。 – MisterZimbu 2011-05-26 19:21:38

+0

這很有趣...這正是我想要做的。不過,我通過IE9的WebBrowser控件取得了一些成功。 – 2011-05-27 17:18:16

回答

0

這將解決您的概率,把它放在你的資產淨值請求結束:

myGeckoFxBrowser.Navigate("about:blank"); 
myGeckoFxBrowser.Document.Cookie = ""; 
myGeckoFxBrowser.Stop(); 
0
GeckoFx can only be called from the same thread on which it was initialized (normally the UI thread) 

,所以如果你想打電話GeckoFx控制,該方法必須來自其初始化的GeckoFx線程像你的情況一樣控制它的UI線程。 您可以在Form類使用BeginInvoke,嘗試這樣的:

 this.BeginInvoke(new Action(() => 
     { 
      browser.Navigate(txtUrl.Text); 
      //your code 
     }));