解决WebBrowser控制挑战 > Web刮擦和自动化通常涉及多线程以进行有效的Web请求处理。 但是,在单独线程中使用WebBrowser控件会带来重大困难,尤其是有关
事件的困难,对于确保数据提取或交互之前的完整页面加载至关重要。>
DocumentComplete
> WebBrowser控件是ActiveX组件,需要带有消息泵的STA(单线程公寓)线程。 标准.NET线程通常是MTA(多线程公寓)线程,缺乏此必需要求。
>解决方案:显式sta thread Creation
> 该解决方案涉及创建一个sta线程并明确启动其中的消息泵。 这是一个说明性的例子:
此代码创建一个新的sta线程,将webbrowser分配给它,订阅
>事件,重要的是,包括<code class="language-csharp">private void RunBrowserThread(Uri url) { var thread = new Thread(() => { var webBrowser = new WebBrowser(); webBrowser.DocumentCompleted += Browser_DocumentCompleted; webBrowser.Navigate(url); Application.Run(); // Crucial for the message pump }); thread.SetApartmentState(ApartmentState.STA); thread.Start(); } private void Browser_DocumentCompleted(object sender, WebBrowserDocumentCompletedEventArgs e) { var webBrowser = (WebBrowser)sender; if (webBrowser.Url == e.Url) { Console.WriteLine($"Navigated to {e.Url}"); Application.ExitThread(); // Safely terminates the thread } }</code>>
以启动消息泵。 事件发射后,DocumentCompleted
可清洁停止线程。 这样可以确保可靠的Application.Run()
事件触发。Application.ExitThread()
>
以上是如何在新线程中可靠地使用WebBrowser控件的DocumentComplete事件?的详细内容。更多信息请关注PHP中文网其他相关文章!