2013-06-06 37 views
24

Trong C# class Process kế thừa từ class Component triển khai IDisposable và vì vậy tôi có thể gọi Dispose() trên bất kỳ đối tượng Process nào. Tôi có thực sự phải không? Làm thế nào để tôi biết nếu tôi thực sự phải?Process.Dispose() thực sự làm gì?

Giả sử tôi có đoạn mã sau:

var allProcesses = System.Diagnostics.Process.GetProcesses(); 
var processesNames = processes.Select(p => p.ProcessName); 
// output process names here 

Bây giờ có vẻ như tôi có một loạt các Process đối tượng và tôi có nghề một try-finally đi qua mảng và Dispose() từng đối tượng. Đó chắc chắn là rất nhiều mã phụ.

Điều gì làm Dispose() làm cho các đối tượng Process? Tôi có thực sự cần phải Dispose() mỗi đối tượng Process và làm cách nào để quyết định xem tôi có cần phải làm như vậy không?

+0

thời gian phản xạ? –

Trả lời

23

Tôi có thực sự cần Dispose() mọi đối tượng Process và làm cách nào để quyết định xem tôi có cần phải làm như vậy không?

Có, bạn nên vứt bỏ chúng. Lưu ý văn bản này trong tài liệu cho Process:

Quy trình hệ thống được nhận dạng duy nhất trên hệ thống bằng mã nhận dạng quy trình của nó. Giống như nhiều tài nguyên Windows, một quá trình cũng được xác định bằng tay cầm của nó, có thể không phải là duy nhất trên máy tính. Một xử lý là thuật ngữ chung cho một định danh của một tài nguyên. Hệ điều hành vẫn tiếp tục xử lý, được truy cập thông qua thuộc tính Handle của thành phần Process, ngay cả khi quá trình đã thoát. Vì vậy, bạn có thể nhận được thông tin quản trị của quá trình, chẳng hạn như ExitCode (thường là 0 hoặc không thành công hoặc mã lỗi không phải) và ExitTime. Xử lý là một nguồn tài nguyên cực kỳ có giá trị, do đó, xử lý rò rỉ là độc hại hơn rò rỉ bộ nhớ.

Vì vậy, nếu bạn không Dispose họ, bạn đang có khả năng rò rỉ các xử lý (cho đến khi họ thu gom rác thải - nhưng toàn bộ các điểm Dispose là cho phép dọn dẹp sớm của các nguồn lực)


Lưu ý, ngoài ra, cùng một tài liệu chỉ ra rằng Process ghi đè Dispose(bool) - một đầu mối khác rằng nó thực sự là một cái gì đó khi được gọi là Dispose.

+1

Tôi rất thích một 'sử dụng (IEnumerable ...) 'ở đây :) – eFloh

+2

@eFloh - không chắc chắn những gì bạn đang nhắm đến đó. Câu lệnh 'using' giới thiệu một biến mới và một phạm vi trong đó biến đó sẽ được sử dụng. Vì vậy, trong khi 'sử dụng' chỉ có thể được sử dụng cho các đối tượng dùng một lần, vấn đề là hầu như luôn luôn sử dụng các khía cạnh" không dùng một lần "của chúng trong phạm vi đó. –

+0

chỉ là một shorta syntaqx đẹp ... Cụ thể cho những trường hợp này, nơi bạn có toàn bộ danh sách các lần gỡ bỏ, nó sẽ là tốt đẹp nếu có một cú pháp để cuối cùng vứt bỏ chúng mà không cần một 'cuối cùng {foreach (... x. ..) {x.Dispose(); }} ' – eFloh

1

từ MSDN: http://msdn.microsoft.com/en-us/library/3cc9y48w(v=vs.80).aspx

Gọi Vứt bỏ khi bạn kết thúc bằng cách sử dụng Component. Phương pháp Vứt bỏ rời khỏi Thành phần ở trạng thái không sử dụng được. Sau khi gọi Dispose, bạn phải giải phóng tất cả các tham chiếu đến Component để bộ thu gom rác có thể lấy lại bộ nhớ mà Component đã chiếm.

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