Nach meinem Verständnis von .NET, wenn ich einen BackgroundWorker verwende und einen Event-Handler für RunWorkerCompleted habe, wird der Event-Handler auf demselben Thread laufen, in dem RunWorkerAsync aufgerufen wurde. Wenn ich stattdessen BeginInvoke für einen Delegaten verwende, um eine Methode asynchron auszuführen, und einen AsyncCallback-Parameter an BeginInvoke übergebe, kann ich dann irgendwie festlegen, dass der Callback auf demselben Thread ausgeführt wird, der BeginInvoke aufgerufen hat - oder irgendeinen anderen Thread? Aus meiner Sicht läuft der Callback auf dem nächsten verfügbaren Thread aus dem Thread-Pool. Das ist in Ordnung, aber gibt es einen Weg, wie ich Code in einem AsyncCallback auf jedem beliebigen Thread ausführen kann? Ich weiß, dass Sie BeginInvoke für ein Formular oder Steuerelement verwenden und Code innerhalb des Callbacks für den Thread ausführen können, der das UI-Element erstellt hat. Aber was ist, wenn ich Code auf einem Nicht-UI-Thread ohne Formulare oder Steuerelemente ausführen möchte?
In dem Thread, den Sie als Ziel für Ihre asynchrone Operation verwenden möchten, CurrentDispatcher Property ist ein System.Threading.Dispatcher-Objekt, das verwendet werden kann, um das Ausführen eines Callbacks in diesem Thread zu erzwingen.
Dies ist die Basisklasse, die die Control-Klasse verwendet, um BeginInvoke zu implementieren.
Es sind Fragen zur Verwendung von Windows-Formularen aufgetreten. Ich denke nicht, dass dies ein Problem sein wird, obwohl form.BeginInvoke eine bessere Wahl ist, wenn Sie ein Formular haben. Es scheint, dass sowohl das Formular als auch WPF dieselbe Basisklasse für die Verarbeitung von invoke verwenden. Ссылка
Der Thread ist immer ein Thread-Pool-Thread und wird niemals ein UI-Thread sein.
BTW, C # hat keine Klasse BackgroundWorker
. .NET tut das.
Ich habe eine Suche durchgeführt und bin auf Jon Skeets Website gelandet. Es ist sehr informativ, wie das Threading mit asynchronen Delegaten und Callbacks funktioniert. Ich kann dieses Buch wärmstens empfehlen.
Tags und Links .net c# multithreading