2016-07-01 3 views
0

Was ich habe:Wie nicht in VB.NET während Process.WaitForExit() einfrieren?

Dim test As Process = Process.Start("powershell.exe", "-executionpolicy 
remotesigned -file C:\temp\test.ps1") 

test.WaitForExit() 

Schließlich, während für "Test" warten, friert mein GUI zu verlassen. Wie macht man es glatt?

+0

Try Threading-Funktion in Ihrer Anwendung zu verwenden. – eyeshield21

+1

@ eyeshield21 - Was ist "Threading-Funktion"? – Enigmativity

+1

Warum haben Sie ein Snippet von [eine andere Frage] (http://stackoverflow.com/questions/38144171/how-to-loop-smooth-and-correctly-in-vb-net) als eine brandneue Frage in einem kurze Zeit voneinander? – gravity

Antwort

3

Sie einen BackgroundWorker verwenden könnte diesen Code auf einem separaten Thread ausführen können, können Sie es auf dem UI-Thread ausgeführt werden zur Zeit, die es einzufrieren verursacht.

Diese bekommen sollten Sie begonnen:

Private Sub startWorker() 
    Dim powershellWorker As New BackgroundWorker 
    AddHandler powershellWorker.DoWork, AddressOf doWork 

    powershellWorker.RunWorkerAsync() 
End Sub 

Private Sub doWork(ByVal sender As Object, ByVal e As DoWorkEventArgs) 
    Dim test As Process = Process.Start("powershell.exe", "-executionpolicy remotesigned -file C:\temp\test.ps1") 
    test.WaitForExit() 
End Sub 
+0

Gute Idee trotzdem :) Das Problem ist jetzt, dass ich einen Textbox.text im Hintergrundarbeiter ändern möchte. Es gibt mir " Ungültige Thread-Border-Operation" als Fehler (übersetzt mit Google). Kannst du mir auch helfen? Vielen Dank für Sie Hilfe;) – hannir

+0

Sicher, stellen Sie eine neue Frage und ich oder jemand anderes wird versuchen, Ihnen zu helfen. – Nathan

1

Die test.WaitForExit() ist eine Blockierungsmethode und blockiert den UI-Thread. Versuchen Sie, den Code in einer parallelen Aufgabe auszuführen und warten Sie darauf

Dim task As Task = Task.Run(Sub() 
    Dim test As Process = Process.Start("powershell.exe", "-executionpolicy remotesigned -file C:\temp\test.ps1") 
    Process.WaitForExit() 
    Return test 
    End Sub) 
Dim test2 As Process = Await task 
// some code that will execute after the process completes 

Sie müssen möglicherweise das asynchrone Schlüsselwort zur äußeren Methodendeklaration hinzufügen.

Bitte beachten Sie, dass ich eine C# Person bin :-)

+2

Sie rufen 'Process.WaitForExit()' nie auf. Dies wird nur auf die Ausführung des Codes warten (was in kürzester Zeit erledigt wird). Erstellen Sie stattdessen eine Task, in der Sie nur 'Process.WaitForExit()' ausführen. –

+0

Ich habe vergessen, diese Zeile dort hinzuzufügen. Jetzt ist es besser. Thx – Honzajscz