2015-01-10 117 views
0

我的代碼基本上是這樣的:如何同時運行多個「任務」?

for each (DirectoryInfo di in directoryList) 
{ 
    for each (FileInfo fi in di.GetFiles()) 
    { 
     MyTask(fi.FullName); 
     Console.WriteLine(fi.FullName + " is done."); 
    } 
} 


void MyTask(string arg0) 
{ 
    Process p = new Process(); 
    p.StartInfo.RedirectStandardOutput = true; 
    p.StartInfo.UseShellExecute = false; 
    p.StartInfo.CreateNoWindow = true; 
    p.StartInfo.FileName = "converter.exe"; 
    p.StartInfo.Arguments = "-converterarguments"; 
    p.Start(); 
    p.WaitForExit(); 
} 

如何讓我的程序在同一時間運行多個MyTask/converter.exe的「實例」?

+0

爲什麼不使用任務?另外,訣竅是讓你的MyTask返回進程,所以你可以多次調用它,然後等待所有的進程。 –

+2

注意你寫的代碼。你應該爲它們創建一個數組,並且不要調用'p.WaitForExit()',直到你把所有的'Start()'都編輯完成。 –

+1

你真的想分開*進程嗎?你確定在你想要實現的單個程序中不是單獨的*線程嗎? – Jamiec

回答

1

你可以有你的MyTask返回一個過程,你可以等待:

Process MyTask(string arg0) 
{ 
    Process p = new Process(); 
    p.StartInfo.RedirectStandardOutput = true; 
    p.StartInfo.UseShellExecute = false; 
    p.StartInfo.CreateNoWindow = true; 
    p.StartInfo.FileName = "converter.exe"; 
    p.StartInfo.Arguments = "-converterarguments"; 
    p.Start(); 
    return p; 
} 

然後:

List<Process> processes = new List<Process>(); 

for each (DirectoryInfo di in directoryList) 
{ 
    for each (FileInfo fi in di.GetFiles()) 
    { 
     processes.Add(MyTask(fi.FullName)); 
    } 
} 

foreach(Process p in processes) 
{ 
    p.WaitForExit(); 
} 

更新

你可以通過做一些事情,比如一個進步:

var completed = 0; 

foreach(Process p in processes) 
{ 
    Console.WriteLine("Waiting for processes to complete. Progress: {0}/{1}" 
     completed, processes.Count); 

    p.WaitForExit(); 
    completed++;   
} 

Console.WriteLine("Done. All {0} processes are complete." processes.Count); 

如果第一個過程需要的時間最長完成與此唯一的問題是,你必須爲0的大部分時間進度,那麼它會很快完成。您可以考慮使用任務,而您可以在WaitAny的任務列表中查看。這將使您獲得更好的進展,因爲每次新任務完成時都會進行更新。

+0

是否有可能取得進展?像有多少進程已完成? – John

+0

更新了一些關於進度的更多信息,您應該考慮使用「任務」。 –