2015-01-10 2 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'у Process, поэтому вы можете называть его несколько раз, а затем ждать их всех. –

+2

Обратите внимание на код, который вы написали. Вы должны создать массив из них и не называть 'p.WaitForExit()' до тех пор, пока вы не нажмете 'Start()' all. –

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

Update

Вы могли бы дать ход, делая что-то вроде :

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

Обновлено с дополнительной информацией о прогрессе, и вы должны вместо этого использовать Tasks. –

Смежные вопросы