1

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

4

2 回答 2

0
GeckoFx can only be called from the same thread on which it was initialized (normally the UI thread)

所以如果你想调用 GeckoFx 控件,该方法必须来自初始化 GeckoFx 控件的线程,通常是它的 UI 线程,就像你的情况一样。你可以BeginInvokeForm课堂上使用,试试这样:

        this.BeginInvoke(new Action(() =>
        {
           browser.Navigate(txtUrl.Text);
            //your code
        }));
于 2014-04-18T10:00:03.360 回答
0

这将解决您的问题,将其放在导航请求的末尾:

myGeckoFxBrowser.Navigate("about:blank");
myGeckoFxBrowser.Document.Cookie = "";
myGeckoFxBrowser.Stop();
于 2011-12-09T06:18:28.913 回答