在多线程应用程序中使用 GeckoFX

2023-12-01

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


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

myGeckoFxBrowser.Navigate("about:blank");
myGeckoFxBrowser.Document.Cookie = "";
myGeckoFxBrowser.Stop();
本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

在多线程应用程序中使用 GeckoFX 的相关文章

随机推荐

  • 如果这个类没有 Dispose 方法,它如何实现 IDisposable?

    FtpWeb响应实现 IDisposable 但它没有 Dispose 方法 这怎么可能 它在基类WebResponse中实现 参见http msdn microsoft com en us library system net webre
  • 用于检查输入是否为整数的 C++ 修复[重复]

    这个问题在这里已经有答案了 例如 如果我输入 2a 它不会显示错误 也不会要求用户重新输入该值 我该如何解决 while std cin fail std cout lt lt ERROR enter a number lt lt std
  • 如何使用Guice的@Singleton?

    我需要创建某个类的一个实例 并且这个实例需要可以从代码中的任何位置访问 所以 我找到了 Guice 并且我想使用这个包中的 Singleton 但我没有找到任何示例或一些文档来说明如何使用它以及如何进行声明 Singleton 非常容易使用
  • Addhandler、button.click 未使用 VB.NET 触发

    我遇到了按钮和 AddHandler 的问题 仅当我在 Page load 中使用 AddHandler Button1 click AddressOf 时它才有效 但如果我在子例程之一中动态创建按钮 则该事件不会触发 例如
  • 在大图像中绘制边界框

    我有一个大的二值图像 4k x 7k 像素 我想从中提取整个黄色部分作为单个矩形 我尝试了二元腐蚀来均匀黄色区域内的特征 然后我用了bbox的方法skimage regionprops但对于带有一个大 bbox 的大图像来说 它似乎工作得不
  • 在 html 中创建不可见的文本字段?

    我正在尝试将 html 代码放入我老板提供的设计模型中 并且一些美学 例如搜索栏的形状 有点奇怪和复杂 作为一个简单的解决方案 我想我只需将一个文本字段放在搜索栏的图像上 但我无法让它工作 谁能建议一种方法 将文本字段分层在图像上 使其不可
  • R:根据嵌套组计算比例

    我正在使用 R 编程语言 我有以下数据集 set seed 123 library dplyr Patient ID 1 5000 gender lt c Male Female gender lt sample gender 5000 r
  • 尝试使用 PDO 更新记录

    我更新了问题代码 但仍然有问题 没有错误 但没有更新记录 还需要弄清楚如何写入记录 更新成功 我被困在这个更新页面了
  • 无法打开数据库-Android

    我正在使用 SQL 开发一个简单的 Android 应用程序 我遵循以下指南 http www reigndesign com blog using your own sqlite database in android applicati
  • 使用 AVCaptureSession 和 AVAssetWriter 翻转相机时无缝录音

    我正在寻找一种在前后摄像头之间切换时保持无缝音轨的方法 市场上的许多应用程序都可以做到这一点 一个例子是 SnapChat 解决方案应使用 AVCaptureSession 和 AVAssetWriter 此外 它不应该明确使用 AVMut
  • .Theninclude 用于 Entity Framework Core 2 中的子实体

    以前 使用 net 4 5 2 和 EF 6 时 我有一个通用的Get接受多个的方法包括如下 public abstract class DataContext IdentityDbContext
  • 获取特定时间范围内所有发生变化的文件

    Bash 中的一个非常基本的问题 但我似乎无法弄清楚 我正在寻找一个带有管道的单行命令 在 bash 中查找当前目录中上次在 13 15 到 13 30 之间更改的所有 py 文件 与日期无关 我想我可以用ls and cut但我不确定这是
  • Android - 从另一台设备访问 Google Drive appdata 文件夹,但应用程序相同

    我的应用程序设置为允许将备份保存到 Google Drive 应用程序数据文件夹 这一切在同一台设备上运行得非常好 当我进行备份时 删除应用程序的数据 然后恢复一切正常 但是 当我尝试在一台设备上备份 然后在另一台设备上安装并尝试恢复时 没
  • python opencv-寻找圆(太阳),图片中圆心的坐标

    我是新来的 也是编程方面的新手 我有一个问题 我有 16 位 bmp 文件中的太阳图片 图片看起来是黑色背景的白色圆圈 我想找到一个圆并在 x y 坐标中确定其中心 我有这个脚本 import cv import numpy as np o
  • 执行 a.out 文件时出现问题 (C++) MacOS Sierra 10.12.1

    我刚刚更新到 Sierra 似乎我的编译器由于某种原因崩溃了 我编写的代码在更新之前工作正常 所以我确信这不是问题 但现在当我尝试执行它时它就无法工作 这是输出 g source cpp a out dyld mach o but buil
  • 什么是套接字?这是一个过程吗?

    我正在研究操作系统概念 我发现套接字作为通信的端点 那么套接字到底是什么 它是系统通信的一个过程吗 提前致谢 通过阅读维基百科文章 我可以明白为什么您可能会感到困惑 套接字是一个虚拟设备 也就是说 它是一种用软件编写的设备 没有物理设备 因
  • 如何在 Struts 2 中使用 jQuery Ajax 检查唯一用户?

    我有任何应用程序email id是唯一的 并且当最终用户输入他的email id我已经通过 Ajax 触发了 SQL 查询 它检查这是否email id存在或不存在 直到这里它都工作正常但现在我如果那样怎么办email id存在 然后我想将
  • Android上Service和Activity的通信

    Android 上 Activity 和 Service 之间的通信方式有哪些 今天我学习了如何通过从 Activity 发送 Intent 并使用 BroadcastReceiver 进行回复来进行通信 我还有哪些选择 有人有这方面的教程
  • 在内存中而不是物理文件中创建 PDF

    如何使用 itextsharp 在内存流而不是物理文件中创建 PDF 下面的代码正在创建实际的 pdf 文件 相反 我如何创建一个 byte 并将其存储在 byte 中 以便我可以通过函数返回它 using iTextSharp text
  • 在多线程应用程序中使用 GeckoFX

    我在使用 GeckoFX 时遇到了如何准确处理线程的问题 当尝试在其他线程中使用 GeckoWebBrowser 时 它似乎不断抛出错误 具体来说 我在此测试应用程序中尝试执行的操作是生成网页的缩略图并将其显示在表单上 而不是 WebBro