2009-08-04 18 views
2

Ich habe eine PowerShell-Funktion, um in einem Verzeichnis nach Zip-Dateien zu suchen, sie zu extrahieren und die Dateien umzubenennen. Die Funktion ändert auch das Statusleistenelement, um zu aktualisieren, auf welcher Datei es sich befindet. Mir ist aufgefallen, dass die GUI bei diesem Vorgang einfrieren würde.PowerShell und WPF GUI einfrieren

Wie kann ich die Funktion ausführen und aktualisieren Sie die GUI ohne es zu frieren?

+0

Für einen WPF Hintergrundarbeiter siehe: http://stackoverflow.com/questions/23142137/write-powershell-output-as-it-happens-to-wpf-ui-control/36716964#36716964 – iRon

Antwort

4

Führen Sie keine kostspieligen Vorgänge im UI-Thread durch - verwenden Sie einen Hintergrund-Worker. Hier ist ein Tutorial: http://dotnetperls.com/backgroundworker-introduction

+0

Richard, hast du es probiert? Ich habe mit Winforms gemacht. Ich hatte kein Glück, weil ein Beitrag von 2006 besagt, dass das Problem darin besteht, dass der Worker-Thread keinen Runspace hat, in dem der Befehl ausgeführt werden kann. So z.B. $ w.add_DoWork ({$ global: i = 1}) weist 1 keine globale Variable zu. Ich würde neugierig sein, wie man es einem rapspace zuweist. – stej

+0

Ich meinte, die gesamte Powershell-Pipeline auf dem Hintergrundthread auszuführen, nicht nur den zip-Vorgang. Das ist etwas schwierig, wenn er eine GUI-App rein in Powershell schreibt (mit WPK oder so), aber das war zu der Zeit sehr ungewöhnlich und immer noch zum größten Teil. Ich nahm an, dass er eine normale WPF-App hatte, die bestimmte Admin-ähnliche Aufgaben an Posh delegierte. Die andere Möglichkeit besteht darin, den Write-Progress-Strom zu verwenden, der in Posh v2, z.B. http://blogs.msdn.com/mediaandmicrocode/archive/2009/12/28/write-progress-wpk.aspx –