2016-07-01 5 views
0

Was ich habe:Wie reibungslos und korrekt in VB.NET?

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


     Do Until (ready = True) 

      If Process.GetProcessesByName("powershell").Length <> 0 Then 
       ready = False 
      Else 
       ready = True 
      End If 
     Loop 

... more code ... 

Derzeit mein Programm abstürzt, während Powershell aktiv ist. Wenn das Powershell-Skript zu lange dauert, mehr als 60 Sekunden, stürzt mein Programm ebenfalls ab. Wie es schließlich glatt macht, wie einen Timer zu verwenden, damit es nicht mehr einfriert.

EDIT:

Schließlich würde Ich mag alle 5 Sekunden überprüfen, ob Powershell aktiv ist.

EDIT 2:

Ich kann nur tun

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

    test.WaitForExit() 

Und es stürzt nicht mehr, aber es friert immer noch:/

+0

Mögliche Duplikat [Warten Sie, bis ein Prozess endet] (http://stackoverflow.com/questions/3147911/wait-till-a-process-ends) –

+1

Hinweis (nicht mit dem Problem): ' Während ready = False' und 'Do Until ready = True' dasselbe tun, müssen Sie nur einen von ihnen verwenden. –

+0

Thx @Nico, sry für Flag Kommentar. Nach ein paar Versuchen hast du recht - es klappt nicht mehr nach 60 Sekunden, aber es friert immer noch während der Bearbeitung ein. Möglich das Frieren zu beheben? – hannir

Antwort

0

Probieren Sie einen anderen Thread verwenden, wird es verhindern, dass Ihre Hauptfaden vom Einfrieren. Um zu verstehen, wie die Threads funktionieren, überprüfen Sie einige Tutorials zum Threading wie this one.

Dim Thread1 As Threading.Thread 

Private Sub Button1_Click(sender As Object, e As EventArgs) Handles Button1.Click 
    'Creates a new thread 
    Thread1 = New Threading.Thread(Sub() MyProcess()) 
    'Starts the thread 
    Thread1.Start() 
End Sub 

Private Sub MyProcess() 
    Process.Start("powershell.exe", "-executionpolicy remotesigned -file C:\temp\test.ps1") 

    Do Until (ready = True) 

     If Process.GetProcessesByName("powershell").Length <> 0 Then 
      ready = False 
     Else 
      ready = True 
     End If 
    Loop 
End Sub