2014-05-19 11 views
7

Ich muss viele Befehlszeilenskripts ausführen. Sie sind derzeit in einer List gespeichert. Ich möchte sie alle zur gleichen Zeit laufen lassen und mit dem nächsten Schritt fortfahren nur nachdem alle von ihnen abgeschlossen sind.Warten bis mehrere Befehlszeilenprozesse abgeschlossen sind?

Ich habe versucht den Ansatz, den ich unten zeigen, aber fand es fehlt, weil der letzte Befehl nicht unbedingt Ende letzten. In der Tat, ich fand, dass der letzte Befehl kann sogar die ersten abgeschlossen werden. Also, ich glaube, ich brauche etwas wie WaitForExit(), aber die nicht zurück, bis alle Ausführungsprozesse abgeschlossen sind.

for (int i = 0; i < commands.Count; i++) 
{ 
    string strCmdText = commands[i]; 
    var process = System.Diagnostics.Process.Start("CMD.exe", strCmdText); 
    if (i == (commands.Count - 1)) 
    { 
     process.WaitForExit(); 
    } 
} 
//next course of action once all the above is done 

Antwort

7

Da jeder Aufruf Process.Start einen neuen Prozess gestartet wird, können Sie sie alle einzeln, wie so verfolgen:

var processes = new List<Process>(); 
for (int i = 0; i < commands.Count; i++) 
{ 
    string strCmdText = commands[i]; 
    processes.Add(System.Diagnostics.Process.Start("CMD.exe", strCmdText)); 
} 

foreach(var process in processes) 
{ 
    process.WaitForExit(); 
    process.Close(); 
} 

EDIT

Process.Close() wie in den Kommentaren hinzugefügt

+1

ich diese Lösung finden besser als jede angebotene Aufgabe parallel Ansatz, da es sich nicht unnötig verwenden/erstellen weitere Themen – Edin

+0

Ist es notwendig, zu nennen process.Close()? http://msdn.microsoft.com/en-us/library/fb4aw7b8%28v=vs.110%29.aspx –

+1

Wahrscheinlich nicht unbedingt notwendig, da 'Process' einen Finalizer von' Component' erbt, aber es ist eine gute Übung frühzeitig entsorgen. Es ist auch einfach genug, in diesem Beispiel zu tun (rufen Sie einfach 'Close()' nach 'WaitForExit()' in jeder Schleife Iteration). –

5

Verwenden Sie ein Task-Array und warten Sie, bis alle ausgeführt wurden.

var tasks = new Task[commands.Count]; 
for (int i = 0; i < commands.Count; i++) 
{ 
    tasks[i] = Task.Factory.StartNew(() => { 
     string strCmdText = commands[i]; 
     var process = System.Diagnostics.Process.Start("CMD.exe", strCmdText); 
     process.WaitForExit(); 
    }); 
} 

Task.WaitAll(tasks); 

Oder mehr LINQ-ishly wie folgt aus:

var tasks = commands.Select(strCmdText => Task.Factory.StartNew(() => { 
    var process = System.Diagnostics.Process.Start("CMD.exe", strCmdText); 
    process.WaitForExit(); 
})).ToArray(); 
Task.WaitAll(tasks); 
Verwandte Themen