多线程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中文网其他相关文章!