2014-05-19 16 views
7

Tôi có nhu cầu thực thi nhiều tập lệnh dòng lệnh. Chúng hiện được lưu trữ trong một số List. Tôi muốn chạy tất cả cùng một lúc và tiến hành bước tiếp theo chỉ sau khi tất cả chúng đã hoàn tất.Chờ cho đến khi nhiều quy trình dòng lệnh hoàn tất?

Tôi đã thử cách tiếp cận mà tôi hiển thị bên dưới, nhưng thấy nó thiếu vì lệnh cuối cùng không nhất thiết phải là kết thúc cuối cùng. Trong thực tế, tôi thấy rằng lệnh cuối cùng có thể là trước tiên để hoàn tất. Vì vậy, tôi tin rằng tôi cần một cái gì đó giống như WaitForExit(), nhưng mà không trả lại cho đến khi tất cả quá trình thực hiện đã hoàn thành.

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 

Trả lời

7

Vì mỗi cuộc gọi đến Process.Start bắt đầu một quá trình mới, bạn có thể theo dõi tất cả riêng biệt, như vậy:

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() thêm vào như trong các ý kiến ​​

+1

Tôi thấy giải pháp này tốt hơn so với bất kỳ phương pháp song song nhiệm vụ cung cấp, vì nó không sử dụng không cần thiết/tạo chủ đề hơn nữa – Edin

+0

Có cần phải gọi process.Close()? http://msdn.microsoft.com/en-us/library/fb4aw7b8%28v=vs.110%29.aspx –

+1

Có lẽ không thực sự cần thiết, là 'Process' thừa hưởng một finalizer từ' Component', nhưng đó là thực hành tốt để vứt bỏ sớm. Nó cũng đủ dễ làm trong ví dụ này (chỉ cần gọi 'Close()' sau 'WaitForExit()' trong mỗi lần lặp vòng lặp). –

5

Sử dụng một mảng Nhiệm vụ và chờ cho tất cả chúng hoàn tất.

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); 

Hoặc, nhiều LINQ-ishly như thế này:

var tasks = commands.Select(strCmdText => Task.Factory.StartNew(() => { 
    var process = System.Diagnostics.Process.Start("CMD.exe", strCmdText); 
    process.WaitForExit(); 
})).ToArray(); 
Task.WaitAll(tasks); 
Các vấn đề liên quan