gpt4 book ai didi

c# - System.Diagnostics.Process(当一个进程内部使用另一个进程时)

转载 作者:行者123 更新时间:2023-12-03 21:40:19 24 4
gpt4 key购买 nike

我一直在使用 C# System.Diagnostics.Process 来监视命令行实用程序的输出。

我“内部”监视的进程启动了第二个进程,一旦启动,我就不会收到来自进程对象的进一步输出。

令人沮丧的是,如果您使用 cmd.exe(手动)执行相同的命令(我使用 System.Diagnostics.Process 对象启动),控制台会输出我需要在我的应用程序中看到的每一行。 C# 应用程序!

但是,如果我(出于测试目的)使用 System.Diagnostics.Process 对象启动 cmd.exe,并运行该命令,它仍然会像之前一样停止输出(直接启动 process1.exe);此时将使用第二个.exe。我以为这个测试会合并所有相关进程的所有输出,但事实并非如此。如何将所有这些输出获取到我的 C# 应用程序中?

最佳答案

原因是System.Diagnostics.Process实际上只是监视它所挂接的进程。

避免此问题的一种方法是让您的第一个应用程序在启动第二个应用程序时输出,并且当收到该输出时,从主应用程序监视从(现在是第三个)应用程序创建进程。第三个应用程序启动后,它应该出现在 System.Diagnostics.Process.GetProcesses() 数组中,然后您可以附加到它的 OutputDataReceived 事件。

您的代码将如下所示(未经测试):

private void firstProcess_OutputDataReceived(object sender, System.Diagnostics.DataReceivedEventArgs e)
{
if (e.Data == "Starting next process")
{
System.Diagnostics.Process newProcess = null;

while (newProcess == null)
{
System.Diagnostics.Process[] procs = System.Diagnostics.Process.GetProcesses();

foreach (System.Diagnostics.Process proc in procs)
{
if (proc.ProcessName == "newProcess")
{
newProcess = proc;
break;
}
}

System.Threading.Thread.Sleep(100);
}

newProcess.OutputDataReceived += new System.Diagnostics.DataReceivedEventHandler(newProcess_OutputDataReceived);
}
}

void newProcess_OutputDataReceived(object sender, System.Diagnostics.DataReceivedEventArgs e)
{
// Do something with your data received here.
}

请注意,这只是一个示例,如果您的第三个进程无法启动或结束得太快,那么此方法将卡在无限循环中。该示例只是为了向您提供构建适用于您的特定情况的知识,而我对此并不完全熟悉。您至少应该确保 while 循环不会永远持续下去,并且您可能还需要进行一些其他调整。

编辑:或者,如果您无法修改第一个应用程序的源,您可以简单地创建一个新线程,以这种方式(使用 while 循环)不断监视并以单独的方式处理第三个进程的输出类,或者只是将第三个进程的输出重新路由到第二个进程的输出的处理程序中,以便您可以使用单个方法处理两个进程的所有输出。

关于c# - System.Diagnostics.Process(当一个进程内部使用另一个进程时),我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/2089617/

24 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com