2013-08-01 156 views
0

所以我有這個代碼來啓動一個蝙蝠腳本,它將執行某些Java命令,從「java -version」開始只是爲了得到一些輸出。第一次我把它叫做它可以工作,但第二次我被卡住了一個黑色的CMD屏幕。過程卡住了黑色CMD屏幕

使用相同的代碼,但在不同的位置。

Process proc = new Process(); 
ProcessStartInfo StartInfo = new ProcessStartInfo(); 
StartInfo.RedirectStandardOutput = true; 
StartInfo.RedirectStandardError = true; 
StartInfo.FileName = path + "javaScript.bat"; 
StartInfo.Arguments = "\"" + path + "\""; 
StartInfo.UseShellExecute = false; 
StartInfo.CreateNoWindow = false; 

proc.StartInfo = StartInfo; 

proc.Start(); 

proc.WaitForExit(); 

string output = proc.StandardOutput.ReadToEnd(); 

任何人都可以幫我弄清楚會發生什麼?因爲我沒有得到任何迴音,我懷疑bat文件被卡住的任何地方(回波上的第一個命令是Java的版本,所以應該寫一些東西,而不是僅僅陷入在黑色cmd窗口)

+0

嘗試寫出[標準錯誤](http://msdn.microsoft.com/en-us/library/system.diagnostics.processstartinfo.redirectstandarderror.aspx) – Sayse

+0

我不能自從我永遠卡在WaitForExit()以來,因爲cmd窗口只是坐在那裏無所事事。 –

+0

看到我包括的鏈接..它表明你應該這樣做*之前*等待退出 – Sayse

回答

3
 proc.WaitForExit(); 
     string output = proc.StandardOutput.ReadToEnd(); 

使用此代碼使流程陷入僵局。在清空其輸出緩衝區之前,它不能退出。但是,直到退出纔會看到它的輸出。該計劃不能繼續,你也不能。一種「致命的擁抱」,更爲人所知的是僵局。

只需交換這兩行代碼即可解決問題。

請注意,您也有StandardError的問題,它會在發送一串錯誤文本到該流時仍會發生死鎖。如果你不想閱讀它,那麼不要重定向它。如果你想使它完全穩定,那麼你需要使用BeginErrorReadLine和BeginOutputReadLine。

+0

交換他們,同樣的問題。我想我找到了原因,在我殺死了java.exe之後,它開始執行,似乎java仍在忙着做其他事情。任何方式來解決這個問題或者是一個完整的其他問題,應該在別處討論? –

+0

當然,殺死進程將解決僵局。你也有StandardError的問題,我添加了一個段落。如果你認爲java.exe是怪罪的話,那就試試吧,根本就不用重定向。 –