当您搜索执行命令行工具或命令提示符的方法时,您会发现太多结果,例如this question,this question或this article。它们都包含完全相同问题的解决方案。但是,我目前正在处理的程序必须执行命令行工具近500次。当我执行以下操作时:
for (int i = 0; i < 500; i++)
{
Process.Start("cmd","My Input: " + i);
}
计算机停止响应一段时间,因为同时打开了太多程序。
当我执行以下操作时:
for (int i = 0; i < 500; i++)
{
Process.Start("cmd","My Input: " + i);
System.Threading.Thread.Sleep(myInterval);
}
该程序花费了太多时间来完成工作(如果我的程序在执行这些命令时挂起,我没有问题。)
从我的观点来看,所有这一切发生的主要原因是我每次运行工具时都会打开另一个cmd窗口。我可以保持一个单独的cmd窗口打开并继续提供命令直到我完成了吗?有没有更有效的方法呢?
答案 0 :(得分:5)
如果你可以并行运行你的命令,我最不会这样做:
Parallel.For(0, 500, new ParallelOptions() {MaxDegreeOfParallelism = 8}, i => {
var process = Process.Start("cmd", "My Input: " + i);
process.WaitForExit();
});
所以你并行运行命令,但同时运行的命令不超过8,并且等待命令进程退出直到启动新命令。
对性能有帮助的还有UseShellExecute
和CreateNoWindow
标志,如下所示:
Parallel.For(0, 500, new ParallelOptions() {MaxDegreeOfParallelism = 8}, i => {
var process = Process.Start(new ProcessStartInfo("cmd", "My Input: " + i) {
CreateNoWindow = true,
UseShellExecute = false
});
process.WaitForExit();
});
这可能会或可能不会按预期工作,具体取决于您正在执行的进程类型。如果您只是执行一些.exe应用程序,这应该可以正常工作并且不创建窗口。
我认为你的“cmd”只是你想要执行的应用程序的名称。但是,正如评论中所述,如果您的意思是cmd.exe应用程序 - 很可能您不需要执行它。相反,只需执行您的应用程序本身,而不使用cmd.exe。
答案 1 :(得分:2)
您不需要cmd.exe
来执行命令行程序。此启动过程可能更快:
var process = Process.Start(
new ProcessStartInfo(@"path\to\your\command.exe", "My Input: " + i) {
/* more options if you like */
RedirectStandardOutput = true,
WindowStyle = System.Diagnostics.ProcessWindowStyle.Hidden,
CreateNoWindow = true
}
);
process.WaitForExit();
string output = process.StandardOutput.ReadToEnd();
有关更多可用选项,请参阅ProcessStartInfo的文档。
答案 2 :(得分:0)
你尝试过多线程吗?
for (int i = 0; i < 500; i++)
{
new Thread(() =>
{
Process.Start("cmd","My Input: " + i);
}).Start();
}
它能给你带来更好的表现吗?
编辑:等待..您是否需要命令才能一个接一个地运行?