C# 处理标准液的内容

C# 处理标准液的内容,c#,ubuntu,.net-core,C#,Ubuntu,.net Core,我正在编写一个应用程序来管理流程和处理故障转移。这个程序是用C#for.NET内核编写的,将在Ubuntu服务器16.04 x64上运行 我有这段代码来创建流程并跟踪它们,包括退出事件等 ProcessStartInfo psi = new ProcessStartInfo { WorkingDirectory = "/home/xyzserver/someprocess", FileName = "mono", Arguments = "someprocess.exe"

我正在编写一个应用程序来管理流程和处理故障转移。这个程序是用C#for.NET内核编写的,将在Ubuntu服务器16.04 x64上运行

我有这段代码来创建流程并跟踪它们,包括退出事件等

ProcessStartInfo psi = new ProcessStartInfo
{
    WorkingDirectory = "/home/xyzserver/someprocess",
    FileName = "mono",
    Arguments = "someprocess.exe",
    RedirectStandardOutput = true
};

_proc = Process.Start(psi);
_proc.EnableRaisingEvents = true;
_proc.Exited += ProcOnExited;
我从调用
控制台的文档中了解到,如果
\u proc.StandardOutput
流已满,WriteLine将被阻止。我希望防止这种行为,并处理托管应用程序的所有输出,因为它还将自己写入物理日志

此外,我希望避免将任何输出存储在任何未使用的流缓冲区中,因为它们永远不会被使用。首选解决方案不会
使用ShellExecute

我曾考虑添加这两行,希望任何接收到的数据都能被处理,但我不确定是否正确

_proc.OutputDataReceived += (sender, eventArgs) => {};
_proc.BeginOutputReadLine();

有没有更好的方法来实现这一点?非常感谢您的想法或意见。

我使用3个程序在.NET Core上手动运行了测试:

  • 跟踪TextOutputer程序的HTTP服务器
  • 一种文本输出程序,每秒打印1000个字符并发出HTTP请求
  • 运行TextOutputer的一个实例的程序运行程序

  • 如果没有这两条线,缓冲区将填充高达64k并暂停。有了这两行代码,就不会出现延迟。

    正如链接文章中所说,您可以过滤数据,避免写入控制台的输出。这就是您所做的-您只需忽略传入的数据。你有没有遇到任何问题?您是否尝试过不使用任何数据处理程序?@VMAtm我尝试了文章中提到的异步方法(上文OutputDataReceived)——我创建了一个程序来快速输出文本,并在没有任何问题的情况下运行了几分钟。然而,我也注意到应用程序的RAM使用增加了很多MB,因此我担心即使在我处理它时,运行时也可能将其存储在某个地方。至于同步解决方案,我不完全确定如何测试它是否挂在
    WriteLine
    上,所以我没有。