2012-07-20 111 views
4

我从我的C#应用​​程序中使用System.Diagnostics程序类执行批处理文件,更新我的GUI与沿途的输出,但只要我的批处理文件执行大批量文件是多余的一定数量的行,该过程只是挂起。线的确切量似乎有所不同,但我已经能够用一个简单的批处理文件,打印“凯蒂猫” 316次重现:麻烦从C#

@echo off 
echo Hello Kitty 
echo Hello Kitty 

如果删除了第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(); 

与其他地方的这些声明:

protected Process process; 
protected StreamReader output; 

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

string output; 

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

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

    Application.DoEvents(); 
} 

我不明白它为什么这样做,没有任何例子,我在网上找到任何提及批量文件的大小限制。请指教。

回答

7

你需要不断地读取输出 - 你不能等待到最后。

输出将被缓冲,所以少量(通常约4KB)可以在过程挂起之前被写入。

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

+3

+1,“Hello Kitty \ r \ n”* 315 = 4095B,仅次于4096B的限制。 – 2012-07-20 11:36:52

+1

谢谢!我删除了if语句,现在它工作。 – Stephan 2012-07-20 12:23:12