UIプロセスとワーカープロセスを持つ非常に単純なC#プロジェクトがあります。ワーカーコードは、UIまたはWindowsタスクスケジューラのいずれかで実行できるため、(スレッドではなく)プロセスである必要があります。
UIコードで、にを設定しProcessStartInfo.RedirectStandardOutput
、true
イベントハンドラーを登録します。次に、プロセスを開始します(を使用しProcess.Start()
て呼び出しますProcess.BeginOutputReadline()
。ただし、OutputDataReceivedイベントハンドラーとして指定したメソッドは起動しません。標準出力をリダイレクトせずにワーカープロセスを実行すると、コンソールに期待される出力が表示されます。出力リダイレクトをオンにすると、(期待どおりに)コンソールに何も表示されませんが、イベントハンドラーも起動しません。別のプロセスの標準出力ストリームから非同期で読み取る必要があるものは他にありますか?
編集:私は2つの単純なコンソールプロセスで問題を再現することができました。
最初に親:
using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;
using System.Threading;
using System.Diagnostics;
namespace OutputRedirectionEventHandlerTest
{
class ParentProgram
{
static void Main(string[] args)
{
ProcessStartInfo processInfo = new ProcessStartInfo()
{
FileName = "OutputRedirectionWorker.exe",
RedirectStandardOutput = true,
UseShellExecute = false
};
Process subProcess = new Process()
{
StartInfo = processInfo
};
subProcess.OutputDataReceived +=
new DataReceivedEventHandler(OutputHandler);
subProcess.Start();
subProcess.BeginOutputReadLine();
}
static void OutputHandler(object SendingProcess,
DataReceivedEventArgs args)
{
Console.Out.WriteLine("Received from subprocess: " + args.Data);
}
}
}
そして、子供:
using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;
using System.Diagnostics;
using System.Threading;
namespace OutputRedirectionWorker
{
class ChildProgram
{
static void Main(string[] args)
{
Console.Out.WriteLine("Output1");
Console.Out.WriteLine("Output2");
Console.Out.WriteLine("Output3");
Thread.Sleep(10000);
}
}
}
親によって出力が印刷されることはありません。