Rumah > pembangunan bahagian belakang > C++ > Kenapa kawalan webbrowser saya gagal membakar peristiwa dokumen apabila digunakan dalam benang yang berasingan?

Kenapa kawalan webbrowser saya gagal membakar peristiwa dokumen apabila digunakan dalam benang yang berasingan?

Patricia Arquette
Lepaskan: 2025-02-01 21:31:09
asal
173 orang telah melayarinya

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

Kawalan Webbrowser Multi-threaded dan Acara Dokumen Completed

Apabila memproses pelbagai URL secara serentak, mewujudkan kawalan

yang berasingan untuk setiap URL dalam benang sendiri mungkin kelihatan cekap. Walau bagaimanapun, pendekatan ini sering gagal mencetuskan peristiwa WebBrowser dengan pasti. Artikel ini menerangkan mengapa dan menyediakan penyelesaian. DocumentCompleted

Masalah teras terletak pada sifat kawalan

. Sebagai komponen ActiveX, ia memerlukan benang apartmen tunggal (STA) untuk berfungsi dengan betul. Hanya memulakan benang baru tidak mencukupi; Benang memerlukan gelung mesej untuk memproses acara. Tanpa gelung mesej ini, acara WebBrowser, dan peristiwa penting lain, tidak pernah dihantar. DocumentCompleted

Berikut adalah contoh kod yang diperbetulkan yang menunjukkan penyelesaian:

<code class="language-csharp">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
    }
}</code>
Salin selepas log masuk
Perubahan utama ialah kemasukan

dalam pelaksanaan benang. Garis ini memulakan pam mesej, membolehkan kawalan Application.Run() untuk menerima dan memproses peristiwa seperti WebBrowser. Benang kemudian dengan anggun keluar menggunakan DocumentCompleted selepas navigasi selesai. Ini memastikan pengendalian acara yang betul dan menghalang tingkah laku aplikasi yang tidak dijangka. Application.ExitThread()

Atas ialah kandungan terperinci Kenapa kawalan webbrowser saya gagal membakar peristiwa dokumen apabila digunakan dalam benang yang berasingan?. Untuk maklumat lanjut, sila ikut artikel berkaitan lain di laman web China PHP!

sumber:php.cn
Kenyataan Laman Web ini
Kandungan artikel ini disumbangkan secara sukarela oleh netizen, dan hak cipta adalah milik pengarang asal. Laman web ini tidak memikul tanggungjawab undang-undang yang sepadan. Jika anda menemui sebarang kandungan yang disyaki plagiarisme atau pelanggaran, sila hubungi admin@php.cn
Artikel terbaru oleh pengarang
Tutorial Popular
Lagi>
Muat turun terkini
Lagi>
kesan web
Kod sumber laman web
Bahan laman web
Templat hujung hadapan