2012-07-20 140 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