2010-02-23 34 views
6

Tôi đang sử dụng đối tượng System.Diagnostic.Process của C#.
Một trong các thuộc tính của nó là Id.
Id sản phẩm này không giống với PID, được hiển thị trong Windows Task Manager.
Tại sao điều này?System.Diaganostics.Process.Id Không phải là Id quy trình tương tự được hiển thị trong Trình quản lý tác vụ. Tại sao?

Bạn thấy, sau khi quá trình này được bắt đầu.
Nó khởi chạy hai quy trình không được quản lý khác, mà tôi không thể nhận được ID một cách rõ ràng bằng tham chiếu thuộc tính đối tượng.
Tôi phải tìm kiếm qua tất cả các quy trình để tìm chúng theo tên quy trình qua System.Diagnostics.Process.GetProcesses().

Tôi đang cố gắng tìm một cách đáng tin cậy để tiêu diệt quy trình này và tất cả các quy trình được liên kết theo PID, chế độ hiển thị trong Task Manager.
Có cách nào tốt hơn không?

Tôi không thể chỉ giết tất cả các quy trình với các tên quy trình liên quan, vì điều đó có thể giết chết các trường hợp khác của các quy trình đó không liên quan gì đến chương trình của tôi.

+2

Nếu bạn bắt đầu quá trình với System.Diagnostics.Process, sau đó gọi .Refresh() trước khi kiểm tra ID. ID được gán bởi hệ điều hành khi quá trình bắt đầu, không phải khi đối tượng Process được khởi tạo. –

Trả lời

13

Điều quan trọng là bạn không muốn giết quá trình của mình bằng Id. Trong thực tế, đó là một điều kiện chủng tộc: quá trình sinh sản của bạn có thể chết và một quá trình khác có thể được tạo ra với cùng một Id. Sau đó, khi bạn đi giết nó, bạn sẽ giết chết quá trình mới thay vì cái cũ đã chết rồi.

Cách đáng tin cậy nhất để giết các quá trình sinh sản là đặt chúng vào đối tượng Công việc và chấm dứt công việc khi công việc của bạn hoàn tất.

Dưới đây là một số mã đơn giản để thực hiện một lớp công việc:

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

Tôi đã tưởng tượng rằng khả năng, nhưng không biết phải làm gì. Liệu những quy trình phụ unmanage-phụ (đó là gián tiếp bắt đầu bởi quá trình tôi bắt đầu) được liên quan đến subordinately đối tượng công việc này quá? Vậy nên nếu tôi giết công việc, cả 3 tiến trình đều bị giết? –

+0

BTW, tôi sợ mã trong ngoặc vuông; Tôi chưa hiểu. Các thuộc tính đó có ở trên cùng không? Mã này có bị hạn chế đối với kiến ​​trúc 32 bit không? –

+1

Chấm dứt đối tượng Công việc sẽ chấm dứt quá trình bạn bắt đầu và mọi quá trình được bắt đầu bởi nó, v.v. Và có, đó là những thuộc tính ở trên cùng trong dấu ngoặc đơn. Tôi đã không chạy trên một máy 64-bit, nhưng không có lý do để tin rằng nó sẽ không hoạt động. – Gabe

1

Tôi không thể tạo lại điều này. Tôi vừa chạy mã sau:

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

Tất cả các quy trình được liệt kê đều khớp với PID trong Trình quản lý tác vụ. Điều này đang sử dụng Windows 7 - bạn đang sử dụng hệ điều hành nào? Nếu bạn xem xét các quy trình khác, hãy thực hiện chúng khớp với PID được hiển thị trong Trình quản lý tác vụ?

+0

Jon, hai quy trình còn lại (các quy trình không được quản lý bắt đầu gián tiếp bởi quá trình tôi bắt đầu) khớp. Tuy nhiên, quá trình tôi bắt đầu id là khác nhau trong công việc quản lý, hơn là trong tài sản tham khảo thông qua myProcess.Id. –

+0

BTW, tôi thích phương thức .OrderBy mà bạn đã đăng. Tôi không biết bạn có thể làm điều đó. –

Các vấn đề liên quan