2010-02-22 23 views
7

Nếu bạn có một số khối mã mà bạn muốn ngăn chặn thực hiện khi đối tượng đang được thoát ra và làm sạch, một khóa có thể được sử dụng để ngăn chặn việc thực thi không?Điều gì xảy ra với Monitor.Enter mà không có một Monitor.Exit phù hợp?

Monitor.TryEnter(cleanupLock, ref acquiredLock); 

TryEnter có thể được sử dụng để đảm bảo mã không được thực thi và vì nó không chờ khóa sẽ không có bế tắc.

Một chuỗi khác sẽ lấy khóa khi nó xác định rằng đã đến lúc tắt máy.

Monitor.Enter(cleanupLock); 

Nếu thread dọn dẹp không bao giờ gọi

Monitor.Exit(cleanupLock); 

sẽ này gây ra một vấn đề?

Trả lời

8

Có, không gọi số Monitor.Exit để thành công Monitor.TryEnter hoặc Monitor.Enter là một bản theo dõi nhanh vào bế tắc trong ứng dụng của bạn. Bạn có thể làm cho nó hoạt động trong một trường hợp giới hạn rất nhưng cuối cùng mã hoặc kịch bản sẽ thay đổi và này sẽ quay trở lại để cắn bạn. Chỉ cần không làm điều đó.

+0

Đi ngược lại việc sử dụng thông thường là một đối số tốt chống lại mẫu này. –

6

"Vấn đề" duy nhất sẽ không có mã nào khác có thể chứa khóa trên biến cleanupLock.

Điều này có thể hoặc có thể không phải là vấn đề - tuy nhiên, đó là loại lạm dụng Màn hình, vì vậy tôi sẽ tránh làm điều này. Nó sẽ là tốt hơn để xử lý tình trạng này một cách phổ biến hơn, IMO.

0

điều này có gây ra sự cố không?

Có. Khóa sẽ không bao giờ được thả ra.

Source:

Các thread gọi phải sở hữu khóa trên tham số obj. Nếu chuỗi cuộc gọi sở hữu khóa trên đối tượng được chỉ định và đã thực hiện số lần Thoát và Nhập số cuộc gọi cho đối tượng, thì khóa sẽ được giải phóng. Nếu chuỗi gọi chưa được gọi Exit nhiều lần như Enter, khóa sẽ không được giải phóng.

1

Nếu đây là trình tự tắt máy dọn dẹp thì càng ít thì OK. Bạn có nguy cơ bị ai đó kiểm tra ở đâu đó, do nhầm lẫn, một sự chờ đợi của cleanupLock. Nó có thể trượt vào mã không được chú ý, và hiển thị tại thời điểm khó khăn nhất. Kết quả sẽ là một chủ đề từ chối đóng cửa, có thể giữ quá trình quảng cáo còn sống. Nhưng, vào cuối ngày, bạn chạy cùng một rủi ro với bất kỳ phương pháp nào khác mà bạn sẽ sử dụng (ví dụ cờ tắt máy toàn cầu).

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