我编写了一个程序,使用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循环,这使得转换速度变得非常慢。 有没有更好的方法让每个进程等待自己退出?
答案 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();
}