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