簡體   English   中英

當我從另一個進程的標准輸出中讀取時,為什么我的事件處理程序不觸發

[英]Why don't my event handlers fire when I'm reading from the standard output of another process

我有一個非常簡單的C#項目,具有一個UI進程和一個輔助進程。 輔助代碼需要是一個進程(而不是線程),因為它可以由UI或Windows Task Scheduler運行。

在UI代碼中,我將ProcessStartInfo.RedirectStandardOutput設置為true並注冊了事件處理程序。 然后,我啟動進程(使用Process.Start()並調用Process.BeginOutputReadline() 。但是,我指定為OutputDataReceived事件處理程序的方法永遠不會觸發。當我運行工作進程而不重定向其標准輸出時,我在控制台上看到預期的輸出。當我打開輸出重定向時,在控制台上沒有看到任何東西(如預期的那樣),但是事件處理程序也沒有觸發。是否還需要異步讀取其他內容從另一個過程的標准輸出流?

編輯:我已經設法通過兩個簡單的控制台過程來復制問題。

首先是父母:

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

    }
}

父級不會輸出任何輸出。

你需要了解的是,呼叫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
        }
    }

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM