如何在c#控制台应用程序中止时终止子进程?

时间:2010-01-28 06:08:15

标签: c# process wmi console-application

我有一个控制台应用程序,它使用WMI ManagementClass生成其他win32进程。我有一个要求,当用户通过proc explorer杀死控制台应用程序或按ctrl + c时,应用程序应该终止它创建的所有子进程。是实现这个目标的最好方法吗?

2 个答案:

答案 0 :(得分:3)

请记住,您必须考虑到您的需求,您可以像下面的示例一样。

using System;
using System.Collections.Generic;
using System.Diagnostics;
using System.Linq;
using System.Text;

namespace KillSpawnedProcesses
{
    class Program
    {
        static List<int> _processes = new List<int>();

        static void Main(string[] args)
        {
            Console.CancelKeyPress += new ConsoleCancelEventHandler(Console_CancelKeyPress);

            StartProcesses();
            Console.Read(); //to hold up console
            Console.Read(); //to hold up console
        }

        static void Console_CancelKeyPress(object sender, ConsoleCancelEventArgs e)
        {
            KillProcesses();
        }

        static void StartProcesses()
        {
            for(int i = 0; i < 2; i++)
            {
                Process p = new Process();
                p.StartInfo = new ProcessStartInfo();
                p.StartInfo.FileName = "Notepad.exe";
                p.Start();
                _processes.Add(p.Id);
            }
        }

        static void KillProcesses()
        {
            foreach(var p in _processes)
            {
                Process tempProcess = Process.GetProcessById(p);
                tempProcess.Kill();
            }            
        }
    }
}

答案 1 :(得分:0)

如果子进程有一个消息队列(Win32消息泵送),您可以将WM_CLOSE发布到其主窗口,或定义您自己的消息。否则,您可以使用套接字,管道或同步对象(如事件)来设计进程间通知。

最糟糕的方法是杀死子流程。