を使用してアプリケーションをハングします。アプリケーションコードは次のとおりです。いくつかの時間p.StandardOutput.ReadLine();正常に動作しますが、呼ばれるプログラムは、常に1つの行を出力した場合、いくつかの時間は、それはあなたのプログラムが正しいことを私にStandardOutput.ReadLine()は、C#
1
A
答えて
2
を助けてください、私はすべてのものを試してみましたハングアップが、それでもこのエラー
ProcessStartInfo startInfo = new ProcessStartInfo("c:\\windows\\system32\\test.exe");
String s = " ";
startInfo.WindowStyle = ProcessWindowStyle.Hidden;
startInfo.CreateNoWindow = true;
startInfo.RedirectStandardInput = true;
startInfo.RedirectStandardOutput = true;
startInfo.UseShellExecute = false;
Process p = Process.Start(startInfo);
p.StandardInput.WriteLine("list volume\n");
String f = "";
bool ignoredHeader = false;
s = p.StandardOutput.ReadLine();
p.WaitForExit();
を取得し、その行が短く、システムによって使用されるバッファよりも大きい。
出力されない場合、ReadLine
は返されません。この場合、あなたのプログラムは壊れています。
、それはあまりにも多くを出力した場合は、出力バッファがフル稼働し、誰かが出力から十分に読み取るまでと呼ばれるプログラムは、そのWrite
呼び出しでブロックされます。あなたが最初の行を超えた出力バッファから読んだことがないので、このブロックは永遠に続くだろうし、したがってと呼ばれるプログラムが終了することはありません。これにより、プログラムはデッドロックの原因になりますp.WaitForExit()
。
documentationは明確に述べている:
はそのリダイレクトストリームの最後に読む前に終了した子プロセスを待ちません。
コード例では、
p.WaitForExit
の前にp.StandardOutput.ReadToEnd
を呼び出してデッドロック状態を回避しています。デッドロック状態は、親プロセスがp.StandardOutput.ReadToEnd
より前にp.WaitForExit
を呼び出し、子プロセスがリダイレクトされたストリームを満たすのに十分なテキストを書き込む場合に発生します。親プロセスは、子プロセスが終了するまで無期限に待機します。子プロセスは、無期限に親が完全なStandardOutput
ストリームから読み取るのを待機します。
関連する問題
- 1. アプリケーションは "StandardOutput.ReadLine()"でフリーズします。
- 2. は、C/C++
- 3. C++ C++ではCTOR
- 4. C#ではC++/CLI
- 5. C++テンプレートのパラメータは、C++で
- 6. C#のガベージコレクションは、C#の
- 7. Visual C#またはVisual C++
- 8. デバッグC/C++言語は、ブレークポイント
- 9. 発行システムは、C、C++
- 10. C++は、C++でchar配列
- 11. C++のコードとオブジェクトはC?
- 12. "のbash -c" は、 "ダッシュ-c"
- 13. は長い長いC/C++
- 14. 違い、C++、C#とJavaは
- 15. タイプ「apr_pool_t」はEclipseのC/C++
- 16. JavaオブジェクトのメモリアドレスはC/C++
- 17. 現代のCではC++
- 18. Scalaは:CTRL + C /コントロール+ C/SIGINT
- 19. C#ToDictionaryは、ここではC#7
- 20. は、C#
- 21. は、C#
- 22. はC
- 23. は、C#
- 24. は、C#
- 25. は、C#
- 26. は、C++
- 27. C++は
- 28. は、C#
- 29. はC++
- 30. は、C#
どのようなエラーが表示されますか? – Arion
はおそらく、プログラムは時々何も出力しませんか? – CodesInChaos
また、複数の行を出力することはありますか?その場合、出力バッファがいっぱいになると呼び出されたプログラムはブロックされます。最初の行の後で読むことは決してないので、それは永遠にブロックされるので、 'WaitForExit()'は返りません。呼ばれるプログラムが常に劣らず、これ以上、正確に1行を出力しない限り、つまり、あなたのプログラムは、間違っていません。 – CodesInChaos