我在使用 GeckoFX 时遇到了如何准确处理线程的问题 - 当尝试在其他线程中使用 GeckoWebBrowser 时,它似乎不断抛出错误。
具体来说,我在此测试应用程序中尝试执行的操作是生成网页的缩略图并将其显示在表单上(而不是 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();
这效果很好...一次。我第二次尝试导航时,DocumentCompleted 只会被触发一次(使用 about:blank)。过了一会儿,COM 错误也会弹出。在我看来,这似乎表明调用 Xpcom.Initialize(每个应用程序只能调用一次的静态方法,并且随后每次都不执行任何操作)会将 GeckoFX 永久绑定到该特定线程。永远。
有没有办法让Xpcom和GeckoFX在多线程环境下正常工作?