1

新しく作成されたプロセスの stdoutput を使用する MSDN の例から:

    // This is the code for the base process
    Process myProcess = new Process();
    // Start a new instance of this program but specify the 'spawned' version.
    ProcessStartInfo myProcessStartInfo = new ProcessStartInfo(args[0], "spawn");
    myProcessStartInfo.UseShellExecute = false;
    myProcessStartInfo.RedirectStandardOutput = true;
    myProcess.StartInfo = myProcessStartInfo;
    myProcess.Start();
    StreamReader myStreamReader = myProcess.StandardOutput;
    // Read the standard output of the spawned process. 
    string myString = myStreamReader.ReadLine();
    Console.WriteLine(myString);
    myProcess.WaitForExit();
    myProcess.Close();

myStreamReader.ReadLine() の代わりに myStreamReader.ReadToEnd() を使用している場合でも、myProcess.WaitForExit() を使用しますか? または、ReadToEnd() はプロセスが終了するまで待機しますか?

4

2 に答える 2

3

編集:あなたの質問に直接答えるために、転用 して申し訳ありません。はい、電話する必要がありますProcess.WaitForExit();。これにより、呼び出す前にプロセスがすべての出力を生成したことが保証されますReadToEnd()

ReadToEnd は同期関数です。したがって、コードでそれを呼び出さないと、StandardOutput からの最初の出力のみをキャプチャするまでメイン スレッドがブロックされます。ただし、WaitForExit を使用すると、確実にすべてを取得できます。

また、プロセスの出力の非同期読み取りを行うことを検討することもできます。実装するこのMSDN の例を参照してください。OutputDataRecieved

于 2012-09-10T20:17:56.100 に答える
1

「ReadToEnd」は「StreamReader」オブジェクトに格納された関数であり、プロセスが終了するのを待つこととは関係ないと思いますが、「Process」クラス自体がそれを処理する可能性があります。ちなみに、「StreamReader」が持つすべての機能は、あなたが言及した状況では役に立ちません。

私の見解では、「WaitForExit」を呼び出す必要があり、「Close」も行ったようです。他の方法ではできないいくつかのシステム リソースを解放するためです。私の知る限り、「ReadToEnd」メソッドはこれら 2 つの呼び出しとは関係ありません。

乾杯

于 2012-09-10T19:29:22.187 に答える