2011-08-18 53 views
10

Tôi đang làm việc trên 2 Dịch vụ Windows có cơ sở dữ liệu chung mà tôi muốn khóa (cross-process) với hệ thống Mutex.Tôi có nên vứt bỏ Mutex không?

Bây giờ tôi đang tự hỏi liệu nó ok để chỉ cần gọi WaitOne()ReleaseMutex() trong một khối try-finally hay nên tôi cũng vứt bỏ Mutex (ví dụ trong một khối using). Nếu vậy tôi đoán tôi nên luôn luôn bắt các AbandonedMutexException trên phương pháp WaitOne() hoặc tôi sai ở đây?

+0

Bạn cần AbandonedMutexException để cho bạn biết rằng dịch vụ sở hữu mutex đã đột ngột chấm dứt. Trong trường hợp đó bạn * có * ngừng sử dụng dbase và chờ cho dịch vụ khác bắt đầu lại.Sử dụng quy trình thứ 3 để hoạt động như trọng tài sẽ là khôn ngoan. –

Trả lời

12

Một mutex là một đối tượng kernel Windows (ở đây được bao bọc trong một đối tượng .NET).

Vì vậy, đó là tài nguyên không được quản lý cần được xử lý.

Chính xác hơn, đối tượng .NET chứa HANDLE đối với mutex, phải được giải phóng/xử lý bằng cách nào đó.

Tôi không tin tưởng rằng code sample in the Mutex class docs nơi đối tượng mutex không được xử lý. Mặc dù Henzi có một điểm tốt trong nhận xét: Đối tượng Mutex là tĩnh và sẽ được xử lý bởi finalizer hoặc bị phá hủy bởi nhân Windows khi quá trình thoát.

Ngoài ra, lưu ý rằng Close() cũng sẽ loại bỏ đối tượng.

Tất nhiên, không có gì sai khi giữ đối tượng Mutex hiện có trong ứng dụng của bạn ngay cả khi bạn không sử dụng nó. Chúng là nguồn sáng.

+0

Không còn mẫu mã nào, bạn phải liên kết nó: http://msdn.microsoft.com/en-us/library/system.threading.mutex.aspx –

+1

xong. Tiếp theo thời gian, cảm thấy tự do để chỉnh sửa câu trả lời của tôi ;-) –

+0

Nhưng kể từ khi tôi đang tạo ra các dịch vụ Windows tôi nghĩ rằng tôi không nên bận tâm xử lý trong "thời gian chạy" của các dịch vụ của tôi (mà luôn luôn). Tạo một thể hiện Mutex mới với cùng tên mỗi lần sẽ chỉ quấn cùng một cá thể không được quản lý đúng không? Hay nó sẽ tạo ra các tài nguyên không được quản lý mới hơn và hơn? Tôi có thể Đóng mutex khi một trong các dịch vụ của tôi dừng lại để thực sự làm sạch nó có thể? – Koen

2

Bạn cần phải vứt bỏ các tài nguyên được sử dụng bởi waithandle.

Từ các tài liệu:

phát hành tất cả các nguồn lực được sử dụng bởi các trường hợp hiện tại của lớp WaitHandle . (Được kế thừa từ WaitHandle.)

waithandle sử dụng tài nguyên không được quản lý sẽ được xử lý khi hết hạn sử dụng.

MSDN Documentation Mutex

6

Theo this tên Mutex tự động bị hủy khi quá trình cuối cùng giữ HANDLE của Mutex đó kết thúc.

Trong thuật ngữ không được quản lý bởi MSDN nói

Sử dụng CloseHandle chức năng để đóng xử lý. Hệ thống tự động đóng tay cầm khi quá trình kết thúc. Đối tượng mutex bị hủy khi xử lý cuối cùng của nó đã bị đóng.

Trong .NET bạn nên gọi .Close() trên Mutex - điều này giải phóng các HANDLE ... vì mỗi quá trình được riêng của mình HANDLE khi truy cập ngay cả những tên Mutex này là thực hành phù hợp cùng ... không gọi Close() won' để lại bất kỳ vấn đề nào xảy ra khi quá trình này không còn nữa (finalizers và tất cả) ...

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