C# 由进程启动启动的进程的进程ID

C# 由进程启动启动的进程的进程ID,c#,winforms,process,system.diagnostics,C#,Winforms,Process,System.diagnostics,我试图通过进程启动时保存的进程ID终止进程。但是当我试图从代码隐藏中终止进程时,我捕获的进程ID不存在 下面是启动流程并捕获流程ID的代码 private List<int> pids = new List<int>(); public Form1() { InitializeComponent(); } private void button1_Click(object sender, Event

我试图通过进程启动时保存的进程ID终止进程。但是当我试图从代码隐藏中终止进程时,我捕获的进程ID不存在

下面是启动流程并捕获流程ID的代码

private List<int> pids = new List<int>();
public Form1()
        {
            InitializeComponent();
        }

        private void button1_Click(object sender, EventArgs e)
        {
            pids.Clear();
            Process myprocess= new Process();

            myprocess.StartInfo.FileName = Environment.ExpandEnvironmentVariables(@"%SystemRoot%\system32\cmdkey.exe");
            myprocess.StartInfo.Arguments = "C:\\rdp\\RemoteIn.rdp";
            myprocess.Start();
            pids.Add(myprocess.Id);          
        }

        private void terminateAll()
        {
            //foreach (var p in pids) p.Kill();

            foreach (var i in pids)
            {
                Process p = Process.GetProcessById(i);
                p.Kill();

            }
        }

        private void button2_Click(object sender, EventArgs e)
        {
            terminateAll();
        }
private List pids=new List();
公共表格1()
{
初始化组件();
}
私有无效按钮1\u单击(对象发送者,事件参数e)
{
pids.Clear();
进程myprocess=新进程();
myprocess.StartInfo.FileName=Environment.ExpandEnvironmentVariables(@“%SystemRoot%\system32\cmdkey.exe”);
myprocess.StartInfo.Arguments=“C:\\rdp\\RemoteIn.rdp”;
myprocess.Start();
Add(myprocess.Id);
}
私有void terminatell()
{
//foreach(pids中的var p)p.Kill();
foreach(pids中的var i)
{
进程p=Process.GetProcessById(i);
p、 杀死();
}
}
私有无效按钮2\u单击(对象发送者,事件参数e)
{
terminateAll();
}
当我点击按钮终止进程时,它显示以下错误

有没有办法解决这个问题

在使用Palani Kumar代码之后,我得到了以下异常。

表格是这样的


我不知道为什么您被声明为pids为
列表
,并在按钮单击事件上清除列表(
pids.Clear();
)。无论如何,以下内容也适用于创建多个流程

编辑:与Amrit讨论的内容。Windows 8为连接相同域的mstsc创建子进程。所以我稍微修改了我的代码

    private void button1_Click(object sender, EventArgs e)
    {
        //pids.Clear();
        Process myprocess = new Process();

        myprocess.StartInfo.FileName = Environment.ExpandEnvironmentVariables(@"%SystemRoot%\syswow64\mstsc.exe");
        myprocess.StartInfo.Arguments = "C:\\rdp\\RemoteIn.rdp";
        myprocess.Start();
        Thread.Sleep(100);
        /* Edit */
        Process proc = Process.GetProcessesByName("mstsc").FirstOrDefault(x => !pids.Any(y => y == x.Id));
        if(proc != null)
        {
           pids.Add(proc.Id);
        }
    }


我不知道你为什么坚持

private List<int> pids = new List<int>();
理解流程对象具有安全描述符是很重要的。每个人都可以看到进程的存在,有人可以打开进程来阅读信息或等待进程的结束。开放杀戮需要更多的权利。
CreateProcess
返回的进程句柄具有完全权限。因此,持有用于创建流程的
Process
对象会给您带来这样的优势


另外,我建议您在调用
Kill()
方法之前测试
Process
对象的
HasExited
属性。如果用户将关闭该进程,可以考虑使用<代码> OnEXIT (参见)删除进程。在从<代码>进程< /代码>列表中删除之前,您应该以任何方式调用<代码>关闭()/>代码>方法>代码/>对象,并考虑使用<代码> CuteMeNeWiWOW()/<代码>而不是<代码> KILE()/<代码>方法。您应该测试这两种方法(
CloseMainWindow()
Kill()
),并根据您的情况选择最佳方法。

尝试将流程对象保存在列表中,而不仅仅是Id。是的,与其存储PID,不如存储流程本身,然后您甚至不必调用
Process.GetProcessById(i)可能重复的@Blorgbeard如何保存进程对象?旁注:异常很有可能告诉您真相-您正在通过CMD启动其他进程-因此CMD在此之后可以自由存在。如果我只打开一个.rdp文件,它的工作方式就像魅力一样。但是当我打开另一个.rdp文件时,它会抛出上面的错误。您对这行“pids.Clear();”进行了注释吗?是的,我对pids.Clear()Amrit进行了注释,现在您对打开多个rdp文件有问题吗?或者你只想打开一个rdp,你可以吗?我需要打开多个.rdp文件。
private List<int> pids = new List<int>();
private List<Process> processes = new List<Process>();