2014-05-19 8 views
7

मुझे कई कमांड लाइन स्क्रिप्ट निष्पादित करने की आवश्यकता है। वे वर्तमान में List में संग्रहीत हैं। मैं उन्हें एक ही समय में चलाने के लिए चाहता हूं और उन सभी के बाद अगले चरण केवल के साथ आगे बढ़ना चाहता हूं।एकाधिक कमांड लाइन प्रक्रिया पूरी होने तक प्रतीक्षा करें?

मैंने नीचे दिए गए दृष्टिकोण की कोशिश की है, लेकिन मुझे इसकी कमी है क्योंकि आखिरी कमांड अंत अंतिम नहीं है। असल में, मैंने पाया कि अंतिम आदेश पूरा करने के लिए पहले भी हो सकता है। तो, मेरा मानना ​​है कि मुझे WaitForExit() जैसे कुछ चाहिए, लेकिन तक निष्पादित प्रक्रिया पूरी होने तक वापस नहीं आती है।

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 

उत्तर

7

के बाद से Process.Start की प्रत्येक कॉल एक नई प्रक्रिया शुरू होता है, आप उन सभी को अलग से ट्रैक कर सकते हैं, तो जैसे:

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

संपादित

Process.Close() टिप्पणी में के रूप में जोड़ा

+1

मैं इस समाधान किसी भी पेशकश की कार्य समानांतर दृष्टिकोण की तुलना में बेहतर लगता है, क्योंकि यह अनावश्यक रूप से उपयोग नहीं करता है/आगे धागे बनाने – Edin

+0

यह आवश्यक कॉल कर सकता process.Close()? http://msdn.microsoft.com/en-us/library/fb4aw7b8%28v=vs.110%29.aspx –

+1

शायद कड़ाई से जरूरी नहीं है, क्योंकि 'प्रोसेस' को 'घटक' से फाइनलाइज़र प्राप्त होता है, लेकिन यह अच्छा अभ्यास है जल्दी निपटान करें। इस उदाहरण में करना भी आसान है (प्रत्येक लूप पुनरावृत्ति में 'WaitForExit() 'के बाद बस' बंद करें() 'को कॉल करें)। –

5

एक कार्य सरणी का उपयोग करें और उन सभी को पूरा करने के लिए प्रतीक्षा करें।

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

या, अधिक LINQ-ishly इस तरह:

var tasks = commands.Select(strCmdText => Task.Factory.StartNew(() => { 
    var process = System.Diagnostics.Process.Start("CMD.exe", strCmdText); 
    process.WaitForExit(); 
})).ToArray(); 
Task.WaitAll(tasks); 
संबंधित मुद्दे