加入收藏 | 设为首页 | 会员中心 | 我要投稿 李大同 (https://www.lidatong.com.cn/)- 科技、建站、经验、云计算、5G、大数据,站长网!
当前位置: 首页 > 百科 > 正文

c# – System.Diaganostics.Process.Id不是任务管理器中显示的相

发布时间:2020-12-15 18:17:04 所属栏目:百科 来源:网络整理
导读:我正在使用C#的System.Diagnostic.Process对象. 它的一个属性是Id. 这产生的Id与 Windows的任务管理器中显示的PID不同. 为什么是这样? 一旦这个过程开始,你会看到. 它启动了另外两个非托管进程,我无法通过对象属性引用显式获取ID. 我必须搜索所有进程,通过S
我正在使用C#的System.Diagnostic.Process对象.
它的一个属性是Id.
这产生的Id与 Windows的任务管理器中显示的PID不同.
为什么是这样?

一旦这个过程开始,你会看到.
它启动了另外两个非托管进程,我无法通过对象属性引用显式获取ID.
我必须搜索所有进程,通过System.Diagnostics.Process.GetProcesses()按进程名称查找它们.

我正在尝试通过PID找到一种可靠的方法来终止此进程和所有关联的进程,这是在任务管理器中显示的进程.
有没有更好的办法?

我不能用关联的进程名称杀死所有进程,因为这可能会杀死那些与我的程序无关的进程的其他实例.

解决方法

关键是你不想通过Id杀死你的进程.事实上,这是一种竞争条件:您生成的进程可能会死亡,而另一个进程可能会使用相同的Id创建.然后,当你去杀死它时,你最终会杀死新进程而不是已经死亡的旧进程.

杀死生成进程的最可靠方法是将它们放在Job对象中,并在任务完成后终止Job.

这是一些实现Job类的简单代码:

class Job
{
    [DllImport("kernel32.dll",CharSet = CharSet.Unicode)]
    public static extern IntPtr CreateJobObject(IntPtr lpJobAttributes,string lpName);

    [DllImport("kernel32.dll")]
    public static extern bool AssignProcessToJobObject(IntPtr hJob,IntPtr hProcess);

    [DllImport("kernel32.dll")]
    public static extern bool TerminateJobObject(IntPtr hJob,uint uExitCode);

    IntPtr job;

    public Process StartProc(string commandLine)
    {
        if (job == IntPtr.Zero)
            job = CreateJobObject(IntPtr.Zero,null);
        ProcessStartInfo si = new ProcessStartInfo(@"c:windowssystem32cmd.exe");
        si.Arguments = "/c " + commandLine;
        si.CreateNoWindow = false;
        si.UseShellExecute = false;
        Process proc = Process.Start(si);
        AssignProcessToJobObject(job,proc.Handle);
        return proc;
    }

    public void TerminateProc()
    {
        // terminate the Job object,which kills all processes within it
        if (job != null)
            TerminateJobObject(job,0);
        job = IntPtr.Zero;
    }
}

(编辑:李大同)

【声明】本站内容均来自网络,其相关言论仅代表作者个人观点,不代表本站立场。若无意侵犯到您的权利,请及时与联系站长删除相关内容!

    推荐文章
      热点阅读