在單獨線程中創建 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中文網其他相關文章!