【发布时间】:2010-01-28 06:08:14
【问题描述】:
我有一个控制台应用程序,它使用 WMI ManagementClass 生成其他 win32 进程。当用户通过 proc explorer 或按 ctrl+c 终止控制台应用程序时,我有一个要求,应用程序应该终止它创建的所有子进程。什么是实现这一目标的最佳方法吗?
【问题讨论】:
标签: c# process wmi console-application
我有一个控制台应用程序,它使用 WMI ManagementClass 生成其他 win32 进程。当用户通过 proc explorer 或按 ctrl+c 终止控制台应用程序时,我有一个要求,应用程序应该终止它创建的所有子进程。什么是实现这一目标的最佳方法吗?
【问题讨论】:
标签: c# process wmi console-application
请记住,您必须考虑到您的需求,您可以像下面的示例一样进行操作。
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();
}
}
}
}
【讨论】:
如果子进程有消息队列(Win32消息泵送),你可以将WM_CLOSE发布到它的主窗口,或者定义你自己的消息。否则,您可以使用套接字、管道或同步对象(如事件)来设计进程间通知。
最糟糕的方法是杀死子进程。
【讨论】: