In meiner Anwendung muss ich eine Reihe von Initialisierungsschritten ausführen. Diese dauern 7 bis 8 Sekunden, während derer meine Benutzeroberfläche nicht mehr reagiert. Um dies zu beheben, führe ich die Initialisierung in einem separaten Thread durch:
public void Initialization()
{
Thread initThread = new Thread(new ThreadStart(InitializationThread));
initThread.Start();
}
public void InitializationThread()
{
outputMessage("Initializing...");
//DO INITIALIZATION
outputMessage("Initialization Complete");
}
Ich habe ein paar Artikel darüber gelesen BackgroundWorker
und wie es mir ermöglichen sollte, meine Anwendung reaktionsfähig zu halten, ohne jemals einen Thread schreiben zu müssen, um langwierige Aufgaben auszuführen, aber ich hatte keinen Erfolg bei der Implementierung, könnte jemand sagen, wie ich es machen würde dies mit dem BackgroundWorker
?
c#
wpf
multithreading
backgroundworker
Eamonn McEvoy
quelle
quelle
Antworten:
Fortschritt verfolgen (optional, aber oft nützlich)
a) abonnieren Sie das
ProgressChanged
Ereignis und verwenden Sie esReportProgress(Int32)
inDoWork
b) setzen
worker.WorkerReportsProgress = true;
(Credits auf @zagy)quelle
Vielleicht möchten Sie auch die Verwendung untersuchen
Task
von Hintergrundarbeitern anstelle von Hintergrundarbeitern untersuchen.Der einfachste Weg, dies zu tun, ist in Ihrem Beispiel
Task.Run(InitializationThread);
.Die Verwendung von Aufgaben anstelle von Hintergrundarbeitern bietet mehrere Vorteile. Beispielsweise werden die neuen asynchronen / wartenden Funktionen in .net 4.5
Task
zum Threading verwendet. Hier finden Sie eine Dokumentation zuTask
https://docs.microsoft.com/en-us/dotnet/api/system.threading.tasks.taskquelle
BackgroundWorker
. In der Hoffnung, die Leute dorthin zu lenken.async
undawait
. Dies sind sprachintegrierte Methoden, um Aufgaben besser lesbar zu nutzen.Verweisen Sie auch auf den folgenden Link, um die Konzepte von zu verstehen
Background
:http://www.c-sharpcorner.com/UploadFile/1c8574/threads-in-wpf/
quelle
Ich habe das gefunden ( WPF-Multithreading: Verwenden des BackgroundWorker und Melden des Fortschritts an die Benutzeroberfläche. Link ) den Rest der Details enthält, die in @ Andrews Antwort fehlen.
Das einzige, was ich sehr nützlich fand, war, dass der Arbeitsthread nicht auf die Steuerelemente des MainWindow zugreifen konnte (in seiner eigenen Methode), aber wenn ein Delegat im Haupt-Windows-Ereignishandler verwendet wurde, war dies möglich.
quelle