Nếu tôi đang sử dụng EventWaitHandle
(hoặc AutoResetEvent
, ManualResetEvent
) để đồng bộ hóa giữa các chuỗi thì tôi có cần gọi các phương thức Close()
hoặc Dispose()
trên sự kiện đó khi xử lý xong không?Tôi có cần Vứt bỏ() hoặc Đóng() một EventWaitHandle không?
EventWaitHandle
kế thừa từ WaitHandle
, triển khai IDisposable
. Và FxCop than phiền nếu tôi không triển khai IDisposable
trên bất kỳ lớp nào có chứa EventWaitHandle
. Vì vậy, điều này cho thấy rằng tôi cần phải gọi nó.
Tuy nhiên không ai trong số những ví dụ sử dụng MSDN gọi Dispose()
hoặc Close()
:
http://msdn.microsoft.com/en-us/library/system.threading.eventwaithandle(VS.80).aspx http://msdn.microsoft.com/en-us/library/system.threading.manualresetevent(VS.80).aspx http://msdn.microsoft.com/en-us/library/system.threading.autoresetevent(VS.80).aspx
Đây có phải là chỉ là một ví dụ của Microsoft phớt lờ lời khuyên của riêng mình?
Tôi cho rằng việc cho phép GC thu thập nó là khá không mong muốn. Rời khỏi công việc cho chuỗi Finalizer chỉ là thực hành không tốt. Chỉ có một chuỗi finalizer đơn và khiến nó làm nhiều hơn nó thực sự không tốt. Nếu chuỗi bị chặn, ứng dụng của bạn bị treo. Nếu một ngoại lệ được ném vào chuỗi finalizer, AppDomain của bạn bị treo. Có mẫu vứt bỏ thích hợp đảm bảo rằng GC.SuppressFinalize() được gọi là do đó triệt tiêu hoàn thiện đối tượng này. Tôi có một ví dụ về việc triển khai IDisposable - http://dave-black.blogspot.com/2011/03/how-do-you-properly-implement.html –
Tôi đồng ý và đó là lý do tại sao tôi tuyên bố rằng bạn nên gọi rõ ràng 'Vứt bỏ '. –