pat.bat
Goto Top

VB.Net - Powershell - CancelAsync BGW

Hallo zusammen,

ich musste mein Programm leicht umändern, sodass Listen, anstatt in VB.Net nun über Powershell erzeugt werden. Trotzdem wird alles noch per vb.net application gesteuert.

Nun bin ich aber auf folgendes Problem gestoßen. Ich habe die Ausführung des Powershell Skripts in die Methode DoWork eines Backgroundworkers gepackt.

    Private Sub BGW_DoWork(sender As Object, e As DoWorkEventArgs) Handles BGW.DoWork
        Dim PathToday As String
        PathToday = "\\Vdm-11\lup-daten\FD_50_Bank\Einrichtungen_Zahllisten\" _  
                                & Format(DateTimePicker1.Value, "yyyy") & "\" & Format(DateTimePicker1.Value, "MM-yyyy") & "\" & Format(DateTimePicker1.Value, "dd-MM-yyyy") & "\" ' & FileName & "\"  

        ' Wenn Ausgabeverzeichnis noch nicht existiert, dann erstellen  
        If Not (Directory.Exists(PathToday)) Then
            Directory.CreateDirectory(PathToday)
        End If

        Dim proc As Process
        Dim procStartInfo As ProcessStartInfo
        procStartInfo = New ProcessStartInfo
        procStartInfo.FileName = "powershell.exe"  
        procStartInfo.Arguments = "-File H:\Entwicklung\Zahllaufkalender\Zahllaufkalender\Zahllaufkalender\bin\Debug\Skripts\ZahllistenErstellen.ps1 -PfadText " & txtBoxFile.Text.ToString & " -Speicherpfad " & PathToday  
        proc = Process.Start(procStartInfo)
        proc.WaitForExit()
        MsgBox("Fertig")  
    End Sub

In dem Programm gibt es einen Abbrechen Button. Dieser Triggert dann die Funktion BGW.CancelAsync()

    Private Sub btnCancel_Click(sender As Object, e As EventArgs) Handles btnCancel.Click

        BGW.CancelAsync()

    End Sub

Allerdings läuft das Powershell Skript trotzdem weiter, da dieses soweit nichts mit der vb application zu tun hat oder sehe ich das falsch und es müsste funktionieren?

Und eine weitere Frage, immer wenn das PS Skript eine Liste fertig hat, kann ich dann einen Rückgabewert 1 an die vb.net application übergeben damit die ProgressBar was zum verarbeiten hat?

Vielen Dank im Voraus.

Content-Key: 502239

Url: https://administrator.de/contentid/502239

Ausgedruckt am: 28.03.2024 um 19:03 Uhr

Mitglied: 141320
141320 08.10.2019 aktualisiert um 17:28:53 Uhr
Goto Top
Allerdings läuft das Powershell Skript trotzdem weiter, da dieses soweit nichts mit der vb application zu tun hat oder sehe ich das falsch und es müsste funktionieren?
Nein die Funktion der Methode CancelAsync ist eine andere als du vermutest, den Text zur Methode mal genau lesen:
https://docs.microsoft.com/en-us/dotnet/api/system.componentmodel.backgr ...

CancelAsync submits a request to terminate the pending background operation and sets the CancellationPending property to true.

When you call CancelAsync, your worker method has an opportunity to stop its execution and exit. The worker code should periodically check the CancellationPending property to see if it has been set to true.
Die Methode schickt also nur eine "Anfrage", diese zu Handeln und den PS Prozess zu stoppen/killen ist deine Aufgabe. Z.B. über das Erstellen der Process-Objects ohne Blocking WaitForExit und periodisches Abfragen des Cancelation-Parameters, oder das ganze über Event-Sinks machen.
kann ich dann einen Rückgabewert 1 an die vb.net application übergeben damit die ProgressBar was zum verarbeiten hat?
Ja. ExitCode Property des Process Objects abfragen und dann mit BeginInvoke und/oder Delegates dein Control updaten:
https://blogs.msdn.microsoft.com/make_it_better/2017/05/15/updating-wind ...