System.Diaganostics.Process.Id Isn't the Same Process Id Shown in Task Manager. Why?

前端 未结 2 371

I\'m using C#\'s System.Diagnostic.Process object.
One of its properties is Id.
The Id this produces is not the same as the

相关标签:
2条回答
  • 2021-01-05 04:52

    I can't reproduce this. I've just run the following code:

    foreach (var proc in Process.GetProcesses()
                                .OrderBy(proc => proc.Id))
    {
        Console.WriteLine("{0}: {1}", p.Id, p.ProcessName);
    }
    

    All the processes listed have matches the PID in Task Manager. This is using Windows 7 - what OS are you using? If you look at other processes, do they match the PID shown in Task Manager?

    0 讨论(0)
  • 2021-01-05 05:01

    The key is that you don't want to kill your process by Id. In fact, that's a race condition: your spawned process could die and another process could get created with the same Id. Then when you go to kill it, you would end up killing the new process instead of the old one that was already dead.

    The most reliable way to kill spawned processes is to put them in a Job object and terminate the Job once your task is completed.

    Here's some simple code to implement a Job class:

    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:\windows\system32\cmd.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;
        }
    }
    
    0 讨论(0)
提交回复
热议问题