2010-08-17 6 views
12

Có khả năng nào để kiểm tra mã nếu một quy trình khác không phản hồi không?Làm cách nào để kiểm tra xem quy trình có phản hồi không?

Vấn đề là ngay cả khi ứng dụng bị lỗi và trên danh sách Người quản lý được đánh dấu là 'Không phản hồi', thuộc tính Process.Responding vẫn đang trả về 'true'.

Sự kiện và chức năng 'Đã thoát' 'WaitForExit' sẽ thực hiện bất kỳ hành động nào nếu quá trình này là điều rõ ràng. Vì vậy, nó không phải là điểm.

Sự cố trong hai từ; Tôi cần biết rằng ứng dụng bị hỏng. Làm thế nào để kiểm tra nó từ mã?

Cảm ơn bạn đã dành thời gian.

+1

Quy trình kia có cửa sổ chính (hiển thị) không? Điều này được yêu cầu bởi 'Process.Responding', xem http://msdn.microsoft.com/en-us/library/system.diagnostics.process.responding.aspx –

+0

ứng dụng của tôi cần kiểm tra quá trình khác, được xác định bởi người dùng tại thời gian chạy. vì vậy tôi không biết nếu nó là ví dụ một ứng dụng giao diện điều khiển. – futurlo

+3

Khác với Quản lý tác vụ heuristic cho các ứng dụng GUI (IIRC: nó xử lý một tin nhắn WN_NULL một cách kịp thời) không có cách chung để xác định "treo" (ví dụ như nó có thể chờ đợi một cái gì đó hoặc bận rộn làm việc). – Richard

Trả lời

19

Không có giải pháp chung cho vấn đề này.

Không thể biết liệu một quy trình cụ thể có bị treo hay không, vì cụm từ "treo" hoàn toàn phụ thuộc vào ngữ cảnh của quá trình đang thực hiện.

Quy trình treo sẽ luôn làm những gì được mã hóa để thực hiện. Nhà phát triển có thể đã mã hóa nó một cách tồi tệ, nhưng Windows không thể đưa ra các giả định về những gì là đúng/sai.

ý tưởng có thể để cố gắng có thể là:

  1. Cuộc gọi Process.Responding sẽ cho biết hoặc không phải là một quá trình được thực hiện một vòng lặp thông điệp cửa sổ được đáp ứng.

  2. Một giải pháp có thể cho trường hợp tổng quát hơn có thể là thăm dò việc sử dụng bộ nhớ cho quy trình trong khoảng thời gian và nếu nó không thay đổi sau khi đủ thời gian, giả sử rằng nó bị treo. Bạn có thể làm điều này với Process.WorkingSet64. Tuy nhiên, tôi hy vọng rằng điều này sẽ gây ra một số sai tích cực - quá trình ổn định mà không xử lý bất cứ điều gì có thể xuất hiện để được treo. Nó cũng sẽ gây ra những âm bản sai khi một quá trình treo có rò rỉ bộ nhớ có vẻ như đang làm một cái gì đó hữu ích, trong khi thực tế nó bị mắc kẹt trong một vòng lặp.

  3. Nếu quá trình ghi vào luồng StandardError/StandardOutput (như nhiều ứng dụng bàn điều khiển), thì bạn có thể thử nghe cho đầu ra như vậy: Process.BeginOutputReadLineProcess.BeginErrorReadLine. Nếu không có đầu ra như vậy trong một khoảng thời gian nhất định, bạn có thể suy luận rằng nó đã bị treo.

Nhưng bạn sẽ không tìm thấy bất kỳ thứ gì hoạt động trong trường hợp chung.