无法从C#执行大型批处理文件

Ste*_*han 4 c# system.diagnostics batch-file

我正在使用System.Diagnostics类从我的C#应用​​程序执行批处理文件,在整个过程中使用输出更新我的GUI,但是只要我的批处理文件超过一定数量的行,该过程就会挂起.确切的线条数量似乎有所不同,但我已经能够使用一个简单的批处理文件重现它,打印出"Hello Kitty"316次:

@echo off
echo Hello Kitty
echo Hello Kitty
Run Code Online (Sandbox Code Playgroud)

等等

如果我删除第316行,批处理文件执行正常,表单应用程序按预期运行,但是更多行导致进程无限期挂起,甚至不生成前300个hello kitty中的一个.

这是我执行批处理文件的代码:

process = new System.Diagnostics.Process();
process.StartInfo.FileName = batchName;
process.StartInfo.Arguments = " < nul";
process.StartInfo.CreateNoWindow = true;
process.StartInfo.RedirectStandardOutput = true;
process.StartInfo.RedirectStandardError = true;
process.StartInfo.UseShellExecute = false;
process.Start();
Run Code Online (Sandbox Code Playgroud)

这些在其他地方宣布:

protected Process process;
protected StreamReader output;
Run Code Online (Sandbox Code Playgroud)

我的主要表单做了这样的事情(简化了一点):

string output;

while (!proc.Process.HasExited)
{
    proc.Process.WaitForExit(200);

    if (proc.Process.HasExited)
    {
        output = proc.Output.ReadToEnd();
        rtbStatus.AppendText(output);
    }

    Application.DoEvents();
}
Run Code Online (Sandbox Code Playgroud)

我不明白为什么会这样做,我在网上找到的例子都没有提到批处理文件的大小限制.请指教.

Ben*_*Ben 7

你需要不断读取输出 - 你不能等到最后.

输出将被缓冲,因此在进程挂起之前可以写入少量(通常约4KB).

另一种方法是将输出定向到文件然后读取文件.

  • +1,"Hello Kitty\r \n"*315 = 4095B,仅次于4096B限制. (3认同)