在单独线程中创建 WebBrowser 控件
在尝试通过为每个 URI 在单独线程中创建一个新的 WebBrowser 控件来自动点击一系列 URL 时,您可能会遇到一个问题,即线程在文档完全加载之前结束,因此永远不会触发 DocumentComplete 事件。
为了解决这个问题,需要创建一个 STA(单线程单元)线程来泵送消息循环。这为 WebBrowser 控件等 ActiveX 组件提供了合适的环境。以下示例代码演示了如何实现这一点:
<code class="language-csharp">private void runBrowserThread(Uri url) { var th = new Thread(() => { var br = new WebBrowser(); br.DocumentCompleted += browser_DocumentCompleted; br.Navigate(url); Application.Run(); }); th.SetApartmentState(ApartmentState.STA); th.Start(); } void browser_DocumentCompleted(object sender, WebBrowserDocumentCompletedEventArgs e) { var br = sender as WebBrowser; if (br.Url == e.Url) { Console.WriteLine("已导航到 {0}", e.Url); Application.ExitThread(); // 停止线程 } }</code>
在此代码中,创建一个新的 STA 线程并将其分配给变量 th。SetApartmentState() 方法用于指定此线程将是 STA 线程。随后,启动线程,并在 br (WebBrowser) 实例上调用 Navigate() 方法以导航到所需的 URL。最后,注册 DocumentCompleted 事件处理程序,并使用 Application.Run() 启动 STA 线程的消息循环。
当文档加载过程完成后,将执行 browser_DocumentCompleted 事件处理程序。它检查加载的 URL 是否与目标 URL 匹配,如果匹配,则将导航信息打印到控制台,并使用 Application.ExitThread() 终止线程。
以上是如何在WebBrowser控制文档完成之前防止线程终止?的详细内容。更多信息请关注PHP中文网其他相关文章!