Ich habe eine Anwendung, die WPF für seine GUI verwendet, aber auf Befehl startet eine sehr hohe Verarbeitungslast. Ich bemerkte, dass meine GUI eher träge war, wenn die Engine (schwere Verarbeitung) lief und als ich das "Application Timeline" -Tool in VS2015 verwendete, bemerkte ich, dass ein Teil meines Engine-Codes auf dem UI-Thread ausgeführt wurde.WPF Dispatcher und Work Stealing?
Der Motor wird mit der folgenden Zeile gestartet, die, wenn ich das LongRunning
Flag verstehe, einen neuen Thread erstellt und die angegebene Funktion für diesen Thread ausführt.
rootTask = Task.Factory.StartNew(DoWork, TaskCreationOptions.LongRunning);
Die DoWork
oben beschriebene Methode wiederholt verwiesen verwendet Parallel.For
Hunderte von Aufgaben in die Warteschlange einzureihen.
Ist es möglich, dass der Dispatcher-Thread "aushilft", indem er Tasks aus der TaskScheduler-Warteschlange ausführt? Wenn ja, ist es möglich, dies zu verhindern, dass die GUI reagiert (was allerdings zu Lasten der Hintergrundaufgaben geht)?
Vielleicht ist die Anzahl der aktiven Threads zu groß und alle Kerne aus der CPU genommen. Sie sollten lieber ein paar Worker-Threads erstellen und Ihre Arbeitselemente in eine Warteschlange stellen, anstatt Hunderte von Threads zu erstellen. – Wouter
Ich erwarte natürlich, alle Prozessorkerne zu verwenden, aber ich glaube, dass "Parrallel.For" Aufgaben im verwalteten Thread-Pool in der Warteschlange, so dass diese Aufgaben nicht auf dem UIhread angezeigt werden sollten und niedrigere Priorität als der Dispatcher –
haben sollten Überprüfen Sie die System.Threading.Thread.CurrentThread.properties wie ManagedThreadId in Ihren Worker-Threads. Wenn alles durch den threadpool geht, sollte es nicht auf dem Hauptthread sein, es sei denn, Dinge werden zurück zum ui thread gesendet. Verwenden Sie auch einen Profiler wie (Concurrency Visualizer), um die Threads zu visualisieren. Beachten Sie jedoch, dass eine große Anzahl von Threads dazu führt, dass Ihre CPU zwischen den Threads wechselt und Ihr Prozess einfriert. Dies kann leicht in Tools wie Process Explorer gesehen werden. – Wouter