首頁 > 後端開發 > C++ > 為什麼我的WebBrowser控件在單獨的線程中使用時無法觸發文檔結束事件?

為什麼我的WebBrowser控件在單獨的線程中使用時無法觸發文檔結束事件?

Patricia Arquette
發布: 2025-02-01 21:31:09
原創
220 人瀏覽過

Why Does My WebBrowser Control Fail to Fire DocumentCompleted Events When Used in a Separate Thread?

多線程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中文網其他相關文章!

本網站聲明
本文內容由網友自願投稿,版權歸原作者所有。本站不承擔相應的法律責任。如發現涉嫌抄襲或侵權的內容,請聯絡admin@php.cn
作者最新文章
熱門教學
更多>
最新下載
更多>
網站特效
網站源碼
網站素材
前端模板