首页 >后端开发 >C++ >为什么我的WebBrowser控件在单独的线程中使用时无法触发文档结束事件?

为什么我的WebBrowser控件在单独的线程中使用时无法触发文档结束事件?

Patricia Arquette
Patricia Arquette原创
2025-02-01 21:31:09175浏览

Why Does My WebBrowser Control Fail to Fire DocumentCompleted Events When Used in a Separate Thread?

多线程WebBrowser控件和DocumentCompleted Event

同时处理多个URL时,为其线程中的每个URL创建一个单独的WebBrowser控件似乎有效。但是,这种方法通常无法可靠地触发事件。 本文解释了原因并提供了一个解决方案。DocumentCompleted

核心问题在于

控制的性质。作为Activex组件,它需要单线程公寓(STA)线程才能正常运行。 简单地启动新线程就不够了;该线程需要一个消息循环来处理事件。 如果没有此消息循环,WebBrowser事件和其他关键事件将永远不会被派遣。DocumentCompleted>

这是一个校正的代码示例,演示了解决方案:

<code class="language-csharp">private void RunBrowserThread(Uri url) {
    var thread = new Thread(() => {
        var browser = new WebBrowser();
        browser.DocumentCompleted += Browser_DocumentCompleted;
        browser.Navigate(url);
        Application.Run(); // Crucial: Starts the message loop
    });
    thread.SetApartmentState(ApartmentState.STA);
    thread.Start();
}

private void Browser_DocumentCompleted(object sender, WebBrowserDocumentCompletedEventArgs e) {
    var browser = (WebBrowser)sender;
    if (browser.Url == e.Url) {
        Console.WriteLine($"Navigated to {e.Url}");
        Application.ExitThread(); // Safely exits the thread
    }
}</code>
关键更改是在线程的执行中包含

。该行启动了消息泵,使Application.Run()控制能够接收和处理WebBrowser之类的事件。 然后在导航完成后使用DocumentCompleted优雅地退出线程。 这样可以确保适当的事件处理并防止意外的应用程序行为。Application.ExitThread()

以上是为什么我的WebBrowser控件在单独的线程中使用时无法触发文档结束事件?的详细内容。更多信息请关注PHP中文网其他相关文章!

声明:
本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系admin@php.cn