2015-01-10 84 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

更新了一些关于进度的更多信息,您应该考虑使用“任务”。 –