1

コンソール アプリケーションがあり、ac# アプリケーションで標準出力を処理したいと考えています。

基本的に、私はすでにこのコードでこれを行うことができました:

Process ProcessObj = new Process();

ProcessObj.StartInfo.WorkingDirectory = WorkingPath;
ProcessObj.StartInfo.FileName = ApplicationPath;
ProcessObj.StartInfo.Arguments = ApplicationArguments;

ProcessObj.StartInfo.UseShellExecute = false;
ProcessObj.StartInfo.CreateNoWindow = true;

ProcessObj.StartInfo.RedirectStandardOutput = true;

// Start the process
ProcessObj.Start();

// loop through until the job is done
bool stopper = false;
while (!stopper)
{
    stopper = ProcessObj.WaitForExit(100);

    string line = null;

    // handle normal outputs (loop through the lines)
    while (true)
    {
        line = ProcessObj.StandardOutput.ReadLine();
        if (line == null)
            break;

        Logger.Trace("Out: \"" + line + "\"");
    }
}

プロセスが数秒しか実行されない場合、すべてが問題なく機能しているように見えます。コンソール アプリケーションの構成を変更してより多くの計算を行うと、プロセスが何時間も実行されるようになります。この間、私の C# アプリケーションはコンソール アプリから応答を受け取りません。コンソール アプリが非表示になっているため、アプリが動かなくなったように見えますが、そうではありません。既にバックグラウンドで実行されており、コンソール アプリの実行が終了したときに、すべての std 出力が c# アプリにのみパイプされているようです。問題は、私の c# アプリに std out 行が表示されないことです。コンソール アプリが終了すると、数時間後に更新されます。

この std out リダイレクトをフラッシュする方法はありますか? これが私が望むように機能しない理由を誰かが知っていますか?

PS: 通常の cmd ウィンドウでコンソール アプリをスタンドアロンとして実行すると、出力は問題なくライブで表示されます。

助けてください。

4

1 に答える 1

1

アプリケーションの実行中に出力を読み取ってみてください。バッファに保存しますか?次に、アプリケーションの終了時に出力を処理します。

擬似的なもの

string buffer = string.Empty;
while(!process.HasExited)
{
    string line = process.Stream.ReadLine();
    if (line != null)
        buffer += Enviorment.Newline + line
}

// Do stuff without put here
Console.Write(buffer);
于 2012-05-24T09:39:13.627 に答える