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
. 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
<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>
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!