2010-04-27 51 views
5

Tôi đang làm một số đa luồng và sử dụng AutoResetEvents và ManualResetEvents làm kiểm soát vòng lặp chính của tôi. Khi "destryoing" các chủ đề tôi cũng phải vứt bỏ những tín hiệu này, điều đó rõ ràng.Làm thế nào để xử lý một waithandle chính xác

Nhưng tôi thấy nhiều cách khác nhau như thế nào để xử lý Waithandles, và tôi không chắc chắn cái nào là đúng:

Version 1

if (disposing) 
{ 
this.threadExitEvent.SafeWaitHandle.Dispose(); 
this.threadExitEvent.Close(); 
this.threadExitEvent = null; 
.... 
} 

Version 2

if (disposing) 
{ 
this.threadExitEvent.Close(); 
this.threadExitEvent = null; 
.... 
} 

Phiên bản 3

if (disposing) 
{ 
this.threadExitEvent.Close(); 
.... 
} 

Trả lời

6

Phiên bản 2 là những gì tôi muốn đi với, như có (có lẽ) không cần phải treo vào của bạn mới được xử lý WaitHandle, do đó, thiết lập nó để null là một ý tưởng tốt. Điều này cũng làm cho nó dễ dàng hơn để thích nghi với đối tượng của bạn có thể phục hồi từ đang được xử lý, như tất cả những gì bạn phải làm là kiểm tra xem nếu WaitHandle là null và tạo lại nó nếu có.

Điều đó đang được nói, không ai sẽ tát tay của bạn để đi với tùy chọn 3.

Không sử dụng tùy chọn 1; nó thường là một ý tưởng tồi để "tiếp cận bên trong" của các đối tượng và bắt đầu xử lý các thành viên. Gọi số Close (từ phương thức Dispose từ IDisposable được triển khai một cách rõ ràng và có mã giống hệt với Close) tự động xử lý việc xử lý SafeWaitHandle. Đừng tự mình làm điều đó.

+0

+ 1 - Tôi hoàn toàn bỏ qua thực tế là Vứt bỏ là một giao diện thực hiện rõ ràng (cảm ơn, Adam!) - đây chắc chắn là con đường để đi. –

+0

Âm thanh hợp lý. Tôi đã đoán rằng phiên bản 2 là phiên bản "sạch nhất". Cảm ơn – TomTom

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