如何同时运行多个“任务”

本文关键字:任务 何同时 运行 | 更新日期: 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任务列表。这将为您提供更好的进度,因为每次新任务完成时它都会更新。