如何同时运行多个“任务”
本文关键字:任务 何同时 运行 | 更新日期: 2023-09-27 18:37:10
我的代码基本上是这样的:
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 的多个"实例"?
你可以让你的 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
任务列表。这将为您提供更好的进度,因为每次新任务完成时它都会更新。