multi-threades webbrowsersteuerung und das documentCompleted Ereignis
Wenn mehrere URLs gleichzeitig verarbeitet werden, scheint das Erstellen einer separaten WebBrowser
-Kontrolle für jede URL in seinem eigenen Thread effizient zu sein. Dieser Ansatz kann das DocumentCompleted
-Ereignis jedoch häufig zuverlässig auslösen. Dieser Artikel erklärt warum und liefert eine Lösung.
Das Kernproblem liegt in der Natur der WebBrowser
Kontrolle. Als ActiveX-Komponente erfordert es einen STA-Faden (Single-Threadede-Apartment), der korrekt funktioniert. Einfach einen neuen Thread zu starten ist nicht ausreichend. Der Thread benötigt eine Nachrichtenschleife, um Ereignisse zu verarbeiten. Ohne diese Nachrichtenschleife werden das Ereignis und andere wichtige Ereignisse nie versandt. 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 } }
in die Ausführung des Threads. Diese Zeile startet die Meldungspumpe und ermöglicht das Empfangen und Verarbeiten von Ereignissen Application.Run()
wie WebBrowser
. Der Thread beendet dann nach Abschluss der Navigation anmutig mit DocumentCompleted
. Dies sorgt für eine ordnungsgemäße Ereignisbehandlung und verhindert unerwartes Anwendungsverhalten. Application.ExitThread()
Das obige ist der detaillierte Inhalt vonWarum fehlt mein Webbrowser -Steuerelement für Feuerdokumente, die in einem separaten Thread verwendet werden?. Für weitere Informationen folgen Sie bitte anderen verwandten Artikeln auf der PHP chinesischen Website!