2008-10-08 66 views
5

Tôi có một ứng dụng C# sử dụng System.Diagnostics.Process để chạy một exe khác. Tôi chạy vào một số mã ví dụ nơi quá trình được bắt đầu trong một khối thử và đóng trong một khối cuối cùng. Tôi cũng thấy mã ví dụ trong đó quá trình không được đóng lại.Điều gì sẽ xảy ra nếu tôi không đóng System.Diagnostics.Process trong ứng dụng giao diện điều khiển C# của tôi?

Điều gì sẽ xảy ra khi quá trình này không được đóng?

Tài nguyên có được sử dụng bởi quy trình được xác nhận lại khi ứng dụng bảng điều khiển đã tạo quy trình được đóng không?

Thật tệ khi mở nhiều quy trình và không đóng bất kỳ quy trình nào trong ứng dụng bảng điều khiển mở trong thời gian dài?

Chúc mừng!

Trả lời

14

Khi quá trình khác thoát, tất cả nguồn lực được giải phóng lên, nhưng bạn vẫn sẽ tổ chức vào một tay cầm quá trình (mà là một con trỏ đến một khối thông tin về quá trình này) trừ khi bạn gọi Close() trên tài liệu tham khảo Process của bạn. Tôi nghi ngờ sẽ có nhiều vấn đề, nhưng bạn cũng có thể. Process thực hiện IDisposable vì vậy bạn có thể sử dụng using(...) tuyên bố C# 's, mà sẽ tự động gọi Dispose (và do đó Close()) dành cho bạn:

using (Process p = Process.Start(...)) 
{ 
    ... 
} 

Như một quy tắc của ngón tay cái: nếu một cái gì đó thực hiện IDisposable, Bạn thực sự nên gọi Dispose/Close hoặc sử dụng using(...) trên đó.

+4

Lưu ý rằng việc gọi Đóng trên quy trình không làm quá trình thoát. –

1

Chúng sẽ tiếp tục chạy như thể bạn tự khởi động chúng.

1

Quy trình là một thực thể độc lập. Tạo lập trình một cách có lập trình cũng giống như việc khởi chạy quy trình từ máy tính để bàn của bạn.

Việc xử lý cho quá trình bạn tạo chỉ được trả lại để thuận tiện. Ví dụ để truy cập vào các luồng đầu vào và đầu ra của nó hoặc (như bạn đã thấy) để giết nó.

Các tài nguyên không được khai hoang khi quá trình cha mẹ bị giết.

Lần duy nhất không tốt để mở nhiều quy trình là nếu bạn mở quá nhiều đến mức CPU và RAM không thể xử lý được!

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