我有一个 C#-Application,它启动一些子进程并重定向它们的标准输入和输出。
如果我以正常方式关闭应用程序,所有子进程都将被销毁,但如果应用程序被任务管理器或其他方式杀死,我将无法关闭子进程。
它们存在并且需要大量的 CPU 能力(接近 99%)。我认为他们需要如此多的力量,因为他们的“重定向”标准输出没有被读取?
有没有办法总是关闭子进程?或者在杀死父进程后减少他们的 CPU 时间?
谢谢和最好的问候
凯文迈尔
我有一个 C#-Application,它启动一些子进程并重定向它们的标准输入和输出。
如果我以正常方式关闭应用程序,所有子进程都将被销毁,但如果应用程序被任务管理器或其他方式杀死,我将无法关闭子进程。
它们存在并且需要大量的 CPU 能力(接近 99%)。我认为他们需要如此多的力量,因为他们的“重定向”标准输出没有被读取?
有没有办法总是关闭子进程?或者在杀死父进程后减少他们的 CPU 时间?
谢谢和最好的问候
凯文迈尔
最简洁的答案是不!
当用户终止您的应用程序进程时,它就被终止了。您对此无能为力,除非您拥有子进程源代码并将其修改为在父进程终止后结束,或者在应用程序终止时使用单独的观察者进程终止应用程序的子进程。
重定向流本身不应该导致高 CPU 使用率,可能正在发生其他事情。
如果我有这个问题,我有时会在所有子进程中检查正在运行的父进程,如果父进程不存在,子进程会退出。
如果要保证子进程在父进程终止时结束,可以使用作业对象。不幸的是,没有简单的方法可以从托管代码中做到这一点。它需要对 Win32 API (如CreateJobObject、AssignProcessToJobObject等)进行大量 P/Invoke 互操作调用。但总的来说,它应该是可能的。
您可以使用命名管道等在父进程和子进程之间进行通信,继续检查父进程是否存在。