什么是" MOST"有效的执行命令行工具的方式太多次了?

时间:2017-01-29 17:43:04

标签: c# performance cmd

当您搜索执行命令行工具或命令提示符的方法时,您会发现太多结果,例如this questionthis questionthis 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窗口打开并继续提供命令直到我完成了吗?有没有更有效的方法呢?

3 个答案:

答案 0 :(得分:5)

如果你可以并行运行你的命令,我最不会这样做:

Parallel.For(0, 500, new ParallelOptions() {MaxDegreeOfParallelism = 8}, i => {
    var process = Process.Start("cmd", "My Input: " + i);
    process.WaitForExit();
});

所以你并行运行命令,但同时运行的命令不超过8,并且等待命令进程退出直到启动新命令。

对性能有帮助的还有UseShellExecuteCreateNoWindow标志,如下所示:

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();
}

它能给你带来更好的表现吗?

编辑:等待..您是否需要命令才能一个接一个地运行?