2010-02-09 30 views
7

Tôi đang viết một đoạn mã C# khởi chạy trình cài đặt và chờ nó trở lại trước khi tiếp tục với các công cụ khác.C# Phát hiện các quá trình sinh sản

Tôi đang gặp sự cố với một số trình cài đặt nhất định sinh ra các quy trình khác với quy trình gốc trở về trước khi quá trình cài đặt hoàn tất. Có cách nào mà tôi có thể đợi cho đến khi tất cả các quy trình đã kết thúc không?

Để làm rõ đây là kịch bản tôi đang gặp rắc rối với:

  1. Launch Installer1
  2. Installer1 spawns/ra mắt một trình cài đặt (Installer2)
  3. Installer 1 lợi nhuận
  4. Application nghĩ cài đặt có đã hoàn tất nhưng Installer2 vẫn đang chạy. Điều này gây ra các vấn đề với quy trình làm việc trong ứng dụng.

Dưới đây là đoạn code tôi đang sử dụng tại thời điểm này:

// launch installer 
Process process = windowsApplicationLauncher.LaunchApplication(_localFilePath); 

// wait for process to return 
do 
{ 
    if (!process.HasExited) 
    { 
    } 
} 
while (!process.WaitForExit(1000)); 

if (process.ExitCode == 0) 
{ 
    _fileService.MoveFile(_localFilePath, _postInstallFilePath); 

    _notification.SetComplete(false); 

    return true; 
} 
return false; 
+0

Bạn có sở hữu các quy trình sinh sản không? Ví dụ. bạn có thể sửa đổi Installer2 nếu điều đó sẽ giúp bạn phát hiện hoàn thành dễ dàng hơn không? Hoặc là Installer2 được cung cấp bởi người khác, hoặc bạn thậm chí không biết những gì các quá trình bổ sung có thể được sinh ra và cần phải xử lý các quá trình sinh sản tùy ý? – itowlson

+0

Chúng tôi sở hữu trình cài đặt cụ thể được đề cập. Tuy nhiên chúng tôi cũng muốn có thể xử lý các quá trình sinh sản tùy ý. – tjjjohnson

Trả lời

6

Bạn có nghĩ đến việc sử dụng WMI để giải quyết vấn đề này không?

Bạn có thể sử dụng WMI để nghe các sự kiện tạo và xóa quy trình. Câu hỏi 967668 có một ví dụ điển hình.

Khi bạn nhận được một sự kiện sáng tạo quá trình, bạn có thể đưa ra một truy vấn WMI để xác định xem quá trình này là một đứa trẻ (hoặc một đứa trẻ của một đứa trẻ vv) của trình cài đặt gốc của bạn với một cái gì đó như sau:

" CHỌN * TỪ Win32_Process WHERE ParentProcessId = ".

+0

cảm ơn vì điều đó rất hữu ích. – tjjjohnson

0

Nó có thể là tốt hơn để làm điều đó theo cách này bên trong do/while loop:

 
System.Diagnostics.Process[] procs = System.Diagnostics.Process.GetProcessesByName(proc.ProcessName, Environment.MachineName); 

Sau đó lặp qua số procs để tìm hiểu vẫn đang chạy ... bằng cách sử dụng thuộc tính HasExited ...

Logic được rằng subprocesses của quá trình được sở hữu bởi mã của bạn, vì vậy bạn có thể kiểm tra đầu tiên nếu họ đã thoát hay không, nếu không muốn nói, giữ looping ...

Hope this helps, Trân trọng, Tom.

+0

Điều đó cho tôi một danh sách các quy trình có cùng tên với quy trình tôi đã khởi chạy (setup.exe) Tôi quan tâm đến các quy trình msiexec.exe được sinh ra bởi thiết lập đó. – tjjjohnson

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