Как завершить дочерние процессы, когда консольное приложение c # прерывается? - PullRequest
1 голос
/ 28 января 2010

У меня есть консольное приложение, которое порождает другие процессы win32 с помощью WMI ManagementClass. У меня есть требование, когда пользователь убивает консольное приложение через proc explorer или, нажав ctrl + c, приложение должно завершить все дочерние процессы, которые оно создало.лучший способ достичь этого?

Ответы [ 2 ]

3 голосов
/ 28 января 2010

Помня о том, что вы должны учитывать свои потребности, вы можете сделать это, как показано ниже.

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();
            }            
        }
    }
}
0 голосов
/ 28 января 2010

Если у подпроцесса есть очередь сообщений (перекачка сообщений Win32), вы можете отправить WM_CLOSE в его главное окно или определить свое собственное сообщение. В противном случае вы можете создать уведомление между процессами, используя объекты Sockets, Pipes или Synchronization, такие как Events.

Худший способ - убить подпроцессы.

...