多線程WebBrowser控件和DocumentCompleted Event
同時處理多個URL時,為其線程中的每個URL創建一個單獨的WebBrowser
控件似乎有效。但是,這種方法通常無法可靠地觸發事件。 本文解釋了原因並提供了一個解決方案。 DocumentCompleted
控制的性質。作為Activex組件,它需要單線程公寓(STA)線程才能正常運行。 簡單地啟動新線程就不夠了;該線程需要一個消息循環來處理事件。 如果沒有此消息循環,WebBrowser
事件和其他關鍵事件將永遠不會被派遣。 DocumentCompleted
>
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 } }
。該行啟動了消息泵,使Application.Run()
控制能夠接收和處理WebBrowser
之類的事件。 然後在導航完成後使用DocumentCompleted
優雅地退出線程。 這樣可以確保適當的事件處理並防止意外的應用程序行為。
以上是為什麼我的WebBrowser控件在單獨的線程中使用時無法觸發文檔結束事件?的詳細內容。更多資訊請關注PHP中文網其他相關文章!