如何限制流程的数量?

时间:2015-05-20 13:46:14

标签: c# cmd

我编写了一个程序,使用Process.Start调用cmd.exe来调用qaac.exe将一首歌转换为aac。

System.Diagnostics.Process p = new System.Diagnostics.Process();
p.StartInfo.FileName = "cmd.exe";
p.StartInfo.Arguments = command;
p.StartInfo.UseShellExecute = false;
p.StartInfo.RedirectStandardInput = true;
p.StartInfo.RedirectStandardOutput = true;
p.StartInfo.RedirectStandardError = true;
p.StartInfo.CreateNoWindow = true;
p.Start();
p.WaitForExit();

它可以工作,但它一次只能转换1首歌曲。现在我想让它总是一次隐藏4首歌曲(一次运行4个流程)。

就像有4个新流程一样。如果退出,请启动一个新的。始终在后台填写4个流程。

怎么做?

@Patrick Hofman 谢谢!有用! 但我遇到的另一个问题。 我重写了我的代码:

        Parallel.ForEach(commands, 
        new ParallelOptions() {MaxDegreeOfParallelism = 4 }, 
        command => trans_aac(command));

        static void trans_aac(string command) {          

        Process proc = new Process();
        proc.StartInfo.FileName = "cmd.exe";
        proc.StartInfo.Arguments = command;
        proc.EnableRaisingEvents = true;
        proc.Exited += ProcessExited;
        proc.Start();
        while (!eventHandled) {

        }
        eventHandled = false;


    }
    static void ProcessExited(object sender, EventArgs e) {

        eventHandled = true;
    }

因为while循环,这使得转换速度变得非常慢。 有没有更好的方法让每个进程等待自己退出?

2 个答案:

答案 0 :(得分:0)

您可以做的最简单的事情是使用Task Parallel Framework' Parallel.ForEach。您可以设置最大同时执行次数:

string[] commands = new string[] { "mspaint", "notepad" };

Parallel.ForEach
( commands
, new ParallelOptions() { MaxDegreeOfParallelism = 4 }
, command => RunOneTask(command)
);

使用命令填充数组或List<string>,并将其传递给方法。您应该将当前代码放入一个单独的方法RunOneTask,它接受​​一个参数:要执行的命令。

答案 1 :(得分:0)

我找到了解决问题的方法。但我想知道无论如何更聪明。

static int i=0

static void send_covert_cmd() {
        if (i < commands.Count) {
            trans_aac(commands[i]);
            i++;
        }
}

//Start 4 process

sendcommand();
sendcommand();
sendcommand();
sendcommand();





static void trans_aac(string command) {
        Process proc = new Process();
        proc.StartInfo.FileName = "cmd.exe";
        proc.StartInfo.Arguments = command;
        proc.EnableRaisingEvents = true;
        proc.Exited += ProcessExited;
        proc.StartInfo.CreateNoWindow = false;
        proc.Start();
}

static void ProcessExited(object sender, EventArgs e) {

        send_covert_cmd();
}