0

UIプロセスとワーカープロセスを持つ非常に単純なC#プロジェクトがあります。ワーカーコードは、UIまたはWindowsタスクスケジューラのいずれかで実行できるため、(スレッドではなく)プロセスである必要があります。

UIコードで、にを設定しProcessStartInfo.RedirectStandardOutputtrueイベントハンドラーを登録します。次に、プロセスを開始します(を使用し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);
        }

    }
}

親によって出力が印刷されることはありません。

4

1 に答える 1

1

の呼び出しがすぐBeginOutputReadLineに戻ることを理解する必要があります。標準出力の非同期読み取りを開始します。

提供した例の問題は、親プログラムがを呼び出した直後に終了することBeginOutputReadLineです。出力を読み取る機会はありません。ChildProgramが開始する前に終了します。親が標準出力を読み取るためには、ある種のループを使用して親を実行し続ける必要があります。

次のようなものを試してください。

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();

        while (Console.ReadLine().ToLower() != "quit") {
            // looping here waiting for the user to type quit
        }
    }
于 2012-05-23T15:46:17.427 に答える