Reaktionsfreudige WPF-Dialogfelder mit „DoEvents“

Wer sein PowerShell-Skript mit einer Fensteroberfläche ausstatten möchte, verwendet dafür WinForms oder WPF. Beide Techniken sind fester Bestandteil der .NET-Laufzeit und damit der PowerShell ab Version 2.0 und beide besitzen ihre kleineren Vor- und Nachteile. Mir gefällt WPF etwas besser, da ich das XAML, mit dem ein Fenster mit seinen Bedienelementen definiert wird, „runterschreiben“ kann ohne dabei viel überlegen zu müssen (ein Ergebnis jahrerlanger Übung). Ein Nachteil ist, genau wie bei WinForms, das ein Fenster immer dann „einfriert“, wenn eine etwas länger andauernde Operation durchgeführt wird, die den Hauptthread blockiert. Es gibt im Web zahlreiche Lösungsvorschläge, die für alle eines gemeinsam haben: Sie sind zu kompliziert, da der Autor einen allgemeinen Ansatz vorstellt, mit dem sich generell beliebige Befehle auf einem weiteren Thread ausführen lassen. Soll lediglich ein Fenster etwas reaktionsfreudiger werden, geht es sehr viel einfacher mit Hilfe des Dispatcher-Objekts, das jedes WPF-Element zur Verfügung stellt:

$ListBox ist ein Beispiel für ein beliebiges WPF-Control, [Action] macht aus einem leeren Scriptblock einen Action-Delegaten und „Background“ ist die Abkürzung für die Enumerationskonstante System.Windows.Threading.DispatcherPriority.Background.

Das folgende Beispiel ist etwas umfangreicher, aber einfach. Es zeigt ein WPF-Fenster mit einer ListBox an, die mit den Zahlen von 1 bis 100 gefüllt wird. Ein Start-Sleep simuliert eine länger dauernde Operation. Dank dem Dispatcher-Aufruf friert weder das Fenster ein, noch ist der zweite Button blockiert, mit dem die ListBox geleer wird.

Eine WPF-ListBox, die Dank Dispatcher-Aufruf etwas reaktionsfreudiger ist

Eine WPF-ListBox, die Dank Dispatcher-Aufruf etwas reaktionsfreudiger ist (aus einem Mpeg4-Video nach Gif konvertiert unter http://ezgif.com)

Schreibe einen Kommentar

Deine E-Mail-Adresse wird nicht veröffentlicht. Erforderliche Felder sind mit * markiert.

Diese Website verwendet Akismet, um Spam zu reduzieren. Erfahre mehr darüber, wie deine Kommentardaten verarbeitet werden .