我有一个非常简单的 C# 项目,它有一个 UI 进程和一个工作进程。工作代码需要是一个进程(而不是线程),因为它可以由 UI 或 Windows 任务计划程序运行。
在 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);
}
}
}
父级不会打印任何输出。