GeckoFX を使用するときにスレッドを正確に処理する方法を把握するのに問題があります。他のスレッドで GeckoWebBrowser を使用しようとすると、常にエラーが発生するようです。
具体的には、このテスト アプリケーションで実行しようとしているのは、Web ページのサムネイルを生成し、それを (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();
}
ただし、ブラウザーの作成とレンダリングを独自のスレッドに移動すると、CreateControl() を呼び出そうとすると COM エラーが発生します。
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();
これはうまくいきます...一度。2 回目にナビゲートしようとすると、DocumentCompleted は 1 回だけ起動されます (about:blank を使用)。しばらくすると、COM エラーも表示されます。これは、Xpcom.Initialize (アプリケーションごとに 1 回だけ呼び出すことができ、その後は何もしない静的メソッド) を呼び出すと、GeckoFX がその特定のスレッドに永続的にバインドされることを示しているようです。永遠に。
Xpcom と GeckoFX をマルチスレッド環境で正しく動作させる方法はありますか?