如何在后台线程中创建和使用WebBrowser?

2024-04-09

如何在后台 STA 线程中创建 System.Windows.Forms.WebBrowser?我尝试使用这样的代码:

var tr = new Thread(wbThread);
tr.SetApartmentState(ApartmentState.STA);
tr.Start();

private void wbThread()
{
     CWebBrowser browser = new CWebBrowser();
     var text = browser.Navigate("http://site.com", CWebBrowser.EventType.loadCompleted).Body.InnerHtml;
}

CWebBrowser - 自定义类,它委托 System.Windows.Forms.WebBrowser 对象 Navigate 方法并等待页面完成加载。问题是 System.Windows.Forms.WebBrowser 对象上的 LoadCompleted 事件永远不会引发。我找到了一些解决方案here https://stackoverflow.com/a/4271581/432853,但它不起作用(在我的 WPF 应用程序上找不到方法 Application.Run() )。

public class CWebBrowser : ContentControl
{
    public readonly System.Windows.Forms.WebBrowser innerWebBrowser;
    private readonly AutoResetEvent loadCompletedEvent;
    private readonly AutoResetEvent navigatedEvent;

    public enum EventType
    {
        navigated, loadCompleted
    }

    public CWebBrowser()
    {
        innerWebBrowser = new System.Windows.Forms.WebBrowser();
        loadCompletedEvent = new AutoResetEvent(false);
        navigatedEvent = new AutoResetEvent(false);

        System.Windows.Forms.Integration.WindowsFormsHost host = new System.Windows.Forms.Integration.WindowsFormsHost();
        host.Child = innerWebBrowser;
        Content = host;

        innerWebBrowser.DocumentCompleted +=new System.Windows.Forms.WebBrowserDocumentCompletedEventHandler(innerWebBrowser_DocumentCompleted);
        innerWebBrowser.Navigated += new System.Windows.Forms.WebBrowserNavigatedEventHandler(innerWebBrowser_Navigated);
    }

    void innerWebBrowser_Navigated(object sender, System.Windows.Forms.WebBrowserNavigatedEventArgs e)
    {
        navigatedEvent.Set();
    }

    void innerWebBrowser_DocumentCompleted(object sender, System.Windows.Forms.WebBrowserDocumentCompletedEventArgs e)
    {
        if (((sender as System.Windows.Forms.WebBrowser).ReadyState != System.Windows.Forms.WebBrowserReadyState.Complete) || innerWebBrowser.IsBusy)
            return;

        var doc = innerWebBrowser.Document;
        loadCompletedEvent.Set();
    }

    public System.Windows.Forms.HtmlDocument Navigate(string url, EventType etype)
    {
        if (etype == EventType.loadCompleted)
            loadCompletedEvent.Reset();
        else if (etype == EventType.navigated)
            navigatedEvent.Reset();

        innerWebBrowser.Navigate(url);

        if (etype == EventType.loadCompleted)
            loadCompletedEvent.WaitOne();
        else if (etype == EventType.navigated)
            navigatedEvent.WaitOne();

        System.Windows.Forms.HtmlDocument doc = null;
        Dispatcher.Invoke(System.Windows.Threading.DispatcherPriority.Background, new Action(
            delegate
            {
                doc = innerWebBrowser.Document;
            }));

        return doc;
    }
}

感谢您的所有建议,并对我的英语不好感到抱歉:o(


为什么不使用像这样的默认 WebBrowser 控件呢?

public MainPage()
{
    InitializeComponent();

    System.Windows.Deployment.Current.Dispatcher.BeginInvoke(startNavigate);
}

void startNavigate()
{
    WebBrowser wb = new WebBrowser();
    wb.LoadCompleted += new LoadCompletedEventHandler(wb_LoadCompleted);
    wb.Navigated += new EventHandler<System.Windows.Navigation.NavigationEventArgs>(wb_Navigated);
    wb.Navigate(new Uri("http://www.google.com"));
}

void wb_Navigated(object sender, System.Windows.Navigation.NavigationEventArgs e)
{
    // e.Content
}

void wb_LoadCompleted(object sender, NavigationEventArgs e)
{
    // e.Content when the document finished loading.
}

编辑:您正在使用旧的System.Windows.Forms.WebBrowser控制,而不是System.Windows.Controls.WebBrowser它是 WPF 的一部分。

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

如何在后台线程中创建和使用WebBrowser? 的相关文章

  • WPF DataGrid 验证/绑定模式错误

    我创建了一个非常简单的新项目 仅测试 Microsoft WPF DataGrid 行为 不涉及其他 我只使用标准的 DataGrid
  • 在视口中查找 WPF 控件

    Updated 这可能是一个简单或复杂的问题 但在 wpf 中 我有一个列表框 我用一个填充数据模板从列表中 有没有办法找出特定的数据模板项位于视口中 即我已滚动到其位置并且可以查看 目前我连接到了 listbox ScrollChange
  • 打印大型 WPF 用户控件

    我有一个巨大的数据 我想使用 WPF 打印 我发现WPF提供了一个PrintDialog PrintVisual用于打印派生的任何 WPF 控件的方法Visual class PrintVisual只会打印一页 因此我需要缩放控件以适合页面
  • WebBrowser.Print() 等待完成。 。网

    我在 VB NET 中使用 WebBrowser 控件并调用 Print 方法 我正在使用 PDF 打印机进行打印 当调用 Print 时 它不会立即启动 它会等到完成整个子或块的运行代码 我需要确保我正在打印的文件也完整并继续处理该文件
  • 中断连接套接字

    我有一个 GUI 其中包含要连接的服务器列表 如果用户单击服务器 则会连接到该服务器 如果用户单击第二个服务器 它将断开第一个服务器的连接并连接到第二个服务器 每个新连接都在一个新线程中运行 以便程序可以执行其他任务 但是 如果用户在第一个
  • DOM 解析器 Chrome 扩展内存泄漏

    问题 我开发了一个扩展程序 可以拦截 Web 请求 获取 Web 请求来源的 HTML 并对其进行处理 我使用 DOMParser 来解析 HTML 并且意识到 DOMParser 正在导致大量内存泄漏问题 最终导致 chrome 扩展崩溃
  • 如何从WPF中的数据网格中获取单元格的值? [复制]

    这个问题在这里已经有答案了 可能的重复 从 DataGrid 中选择 DataGridCell https stackoverflow com questions 9978119 select datagridcell from datag
  • 在java中实现你自己的阻塞队列

    我知道这个问题之前已经被问过并回答过很多次了 但我只是无法根据互联网上找到的示例找出窍门 例如this http tutorials jenkov com java concurrency blocking queues html or t
  • 暂停下载线程

    我正在用 C 编写一个非常简单的批量下载程序 该程序读取要下载的 URL 的 txt 文件 我已经设置了一个全局线程和委托来更新 GUI 按下 开始 按钮即可创建并启动该线程 我想要做的是有一个 暂停 按钮 使我能够暂停下载 直到点击 恢复
  • 如何识别 WPF 文本框中的 ValidationError 工具提示位置

    我添加了一个箭头来指示工具提示中的文本框 当文本框远离屏幕边缘时 这非常有效 但是当它靠近屏幕边缘时 工具提示位置发生变化 箭头显示在左侧 Here is the Image Correct as expected since TextBo
  • 对象锁定私有类成员 - 最佳实践? (爪哇)

    I asked 类似的问题 https stackoverflow com questions 10548066 multiple object locks in java前几天 但对回复不满意 主要是因为我提供的代码存在一些人们关注的问题
  • 命令绑定问题。如何启用命令按钮

    我的代码在这里 gt gt public class Player INotifyPropertyChanging string addressBar public string Url get return addressBar set
  • 如何使用 Dart 读取浏览器中的 cookie?

    问题看起来很简单 但我在文档中找不到如何在没有第 3 方库的情况下在客户端使用 Dart 读取 cookie 我该怎么做 In the dart html你可以使用的库document cookie https api dartlang o
  • Android 中的 java.util.Observable 是线程安全的吗?

    Android 中的 java util Observable 是线程安全的吗 这文档 http developer android com reference java util Observable html说只有deleteObser
  • 使用 Assembly.ReflectionOnlyLoadFrom 加载 WPF 项目引用的程序集时出现奇怪的 FileLoadException

    我有一个自定义 MSBuild 任务 可以查看程序集内部以获取一些属性元数据 Assembly assembly Assembly ReflectionOnlyLoadFrom AssemblyFile 这是我们的自动化构建 发布流程所使用
  • WPF 在菜单上选择项目或在视图模型中获取命令参数

    我正在寻找几个小时来解决一个简单的问题 我想在我的菜单项上使用 SelectedItem 但经过几个小时的 stackoverflow 我发现这是不可能的 我发现了很多关于 CommandParameter 的信息 但我不明白它是如何工作的
  • 在浏览器中语音聊天? [关闭]

    Closed 这个问题需要多问focused help closed questions 目前不接受答案 我们正在寻求建立一个小组 voice 使用服务器上的node js 在浏览器中聊天 这可能吗 如果您希望您的解决方案是基于服务器端和客
  • 锁定 ASP.NET 应用程序变量

    我在 ASP NET 应用程序中使用第三方 Web 服务 对第 3 方 Web 服务的调用必须同步 但 ASP NET 显然是多线程的 并且可能会发出多个页面请求 从而导致对第 3 方 Web 服务的同时调用 对 Web 服务的调用封装在自
  • Control.Focus() 和 FocusManager.SetFocusedElement() 之间的区别

    从字面上看 我想知道这一点 在某些情况下 Focus 看起来比 SetFocusedElement 更好 但另一种情况 则是逆转 所以我必须知道那里有什么不同的东西 另外 根据 MSDN Focus 用于键盘焦点 SetFocusedEle
  • 如何更改 WPF TabControl 的 ItemTemplate 的样式以便设置选项卡标题的背景颜色?

    我使用 WPF TabControl 的 ItemTemplate 属性来绑定每个 TabItem 标头的内容 我还使用 ItemContainerStyle 属性将 TabItem 的内容设置为动态选择的用户控件 此方法 100 按预期工

随机推荐

  • 矩阵求逆 R

    我想求逆方形对称正定矩阵 我知道有两个功能solve and chol2inv 在 R 中 但他们的结果是不同的 我需要知道为什么会发生这种情况 谢谢 以下是计算矩阵逆的几种方法 包括solve and chol2inv gt A lt m
  • 默认情况下启用或禁用菜单项。为什么?

    我有一些遗留代码 由于某种原因 菜单项在启动时被启用或禁用 我的问题是 如何 有没有办法在不调用 EnableMenuItem 函数的情况下执行此操作 MFC 有没有办法做与资源设置所说相反的事情 我也不明白为什么当最后一个子窗口关闭时 当
  • 页面上或 .js 脚本中是否可以有多个 jQuery 就绪事件?

    我注意到 jQuery 就绪事件和函数在我的大部分 JavaScript 中只使用了一次 但是 我想知道是否可以多次使用就绪事件 例如 是否可以在我的主 html 代码中的就绪事件函数调用中调用函数 然后在 js 文件中的另一个就绪事件函数
  • 在 Woocommerce 中下订单后,将值插入自定义表中

    我需要插入到我的自定义表中许可证表 username order id Quantity This needs to be populated when an order is placed Username customer s emai
  • 这段 1988 年的 C 代码有什么问题?

    我正在尝试编译 C 编程语言 K R 一书中的这段代码 它是 UNIX 程序的基本版本wc include
  • 尝试通过我的新域访问 WordPress with LiteSpeed 时显示 404

    我已经在 Digital Ocean Droplet 中创建了一个带有开放 LiteSpeed 缓存的 WordPress 实例 如果我在 设置 常规站点 和 WordPress URL 中配置了 IP 则它可以正常工作 但是当我添加我的
  • SQL:枚举每个组内返回的行

    假设我有一个SELECT 返回某物的查询 像这样 role name MANAGER Alice WORKER Bob WORKER Evan WORKER John MANAGER Max WORKER Steve 是否可以添加另一列来枚
  • 从 Git 存储库安装 Python 包后,某些文件夹丢失

    我想从以下存储库安装软件包https github com geomin django countria https github com geomin django countria 我正在使用的命令是pip install git gi
  • Xcode 存档调试条错误

    我正在尝试将大型遗留 C 库与 iOS 应用程序集成 我们能够在设备上构建并运行 但无法存档该应用程序 归档失败并出现以下错误 命令 Applications Xcode app Contents Developer Toolchains
  • 关闭依赖项的默认功能

    我有一个依赖链 最终依赖于可选地在已弃用的库上 具体来说 我想使用间接依赖于 rustc serialize 的 nalgebra 如下所示 nalgebra gt alga gt num complex gt 可选默认值 rustc se
  • 与多处理错误的另一个混淆是,“模块”对象没有属性“f”

    我知道之前已经回答过这个问题 但似乎直接执行脚本 python filename py 不起作用 我在 SuSE Linux 上安装了 Python 2 6 2 Code usr bin python coding utf 8 from m
  • Spark 作业在 YARN 模式下失败

    我有一个用 Scala 编写的 Spark 程序 它从 HDFS 读取 CSV 文件 计算新列并将其保存为 parquet 文件 我正在 YARN 集群中运行该程序 但每次我尝试启动它时 执行程序都会在某个时候失败并出现此错误 您能帮我找出
  • 如何验证nginx是否正在运行?

    After 运行 ASP NET vNext 项目 http xameeramir github io asp net 5 ubuntu linux 在我的本地机器上我试图弄清楚如何运行它nginx https www nginx com
  • 绑定 elementname 究竟是如何工作的?

    我记得几周前读过 它有时在模板内不起作用 我最近尝试在两个不同的窗口中绑定东西 但它找不到名称声明 所以我假设它是本地的命名空间类 只需通过设置 datacontext 来绑定 然而 我真的很好奇什么时候能够使用绑定元素名 什么时候不能使用
  • __cxa_pure_virtual 的目的是什么?

    在使用 avr gcc 编译时 我遇到了如下链接器错误 undefined reference to cxa pure virtual 我发现了其中指出 The cxa pure virtualfunction 是一个错误处理程序 在调用纯
  • 搜索所有网络上的设备

    我想实现一个代码 通过它我可以列出网络上连接的 upnp 兼容媒体渲染器设备 我用谷歌搜索了这个并找到了以下代码扭曲的网站 https twistedmatrix com documents current core howto udp h
  • 使用 Java 将数据写入 Google Sheets

    我需要将收到的所有反馈放入 Google 表格中 我正在关注这个article https www baeldung com google sheets java client这样做 但问题是 如果我按照这篇文章进行操作 每次需要将某些内容
  • SharedPreferences.edit() 没有相应的 commit() 或 apply() 调用

    我正在将 SharedPreferences 用于我的应用程序的介绍滑块 但是 我在这一行收到错误 class PrefManager private SharedPreferences pref private SharedPrefere
  • Jquery fadeIn 导致滚动顶部,我该如何解决?

    我对 jQuery fadeIn 或 fadeOut 方法有疑问 我建立了一个文章旋转器 一切正常 但是当页面滚动到底部并且文章旋转时出现问题 fadeIn 或fadeOut 方法导致滚动到文章位置 我认为这些方法改变了body的css t
  • 如何在后台线程中创建和使用WebBrowser?

    如何在后台 STA 线程中创建 System Windows Forms WebBrowser 我尝试使用这样的代码 var tr new Thread wbThread tr SetApartmentState ApartmentStat