2011-10-19 44 views
12

Tôi đang cố gắng sử dụng một mutex để bảo vệ quyền truy cập vào một số phần cứng từ nhiều chủ đề, nhưng tôi đang bối rối như những gì các tham số exitContext nghĩa/does:Ngữ cảnh lối ra có nghĩa là gì đối với WaitHandle.WaitOne nghĩa là gì?

public virtual bool WaitOne (
    int millisecondsTimeout, 
    bool exitContext 
) 

The docs nói:

exitContext - đúng để thoát khỏi miền đồng bộ hóa cho ngữ cảnh trước khi chờ (nếu trong ngữ cảnh được đồng bộ hóa) và phản hồi sau đó; nếu không, false.

... nhưng điều đó thực sự có ý nghĩa gì và hậu quả của việc đặt thành đúng hay sai? Tôi đã đặt nó thành hiện thực và mã này dường như hoạt động, nhưng tôi lo lắng rằng tôi không hoàn toàn hiểu những gì nó đang ở dưới mui xe!

Trả lời

5

Nó cũng giải thích further down the page under Remarks rằng:

Ghi chú về Thoát khỏi Context

Tham số exitContext không có tác dụng trừ khi phương pháp WaitOne là gọi từ bên trong một bối cảnh nondefault quản lý. Điều này có thể xảy ra nếu chuỗi của bạn nằm trong một cuộc gọi đến một phiên bản của một lớp bắt nguồn từ ContextBoundObject. Ngay cả khi bạn hiện đang thực hiện một phương thức trên lớp không lấy được từ ContextBoundObject, như là String, bạn có thể ở trong bối cảnh không có lỗi nếu ContextBoundObject nằm trên ngăn xếp của bạn trong miền ứng dụng hiện tại.

Khi mã của bạn được thực hiện trong bối cảnh nondefault, xác định đúng cho exitContext gây thread để thoát khỏi nondefault quản lý ngữ cảnh (có nghĩa là, để chuyển đổi sang bối cảnh mặc định) trước khi thực hiện các phương pháp WaitOne. Chủ đề trở về ngữ cảnh không hoàn toàn sau khi cuộc gọi đến phương thức WaitOne hoàn tất.

Điều này có thể hữu ích khi lớp bị ràng buộc theo ngữ cảnh có SynchronizationAttribute. Trong trường hợp đó, tất cả các cuộc gọi đến các thành viên của lớp được tự động đồng bộ hóa và miền đồng bộ hóa là toàn bộ phần thân của mã cho lớp đó. Nếu mã trong ngăn xếp cuộc gọi của một thành viên gọi phương thức WaitOne và chỉ định đúng cho exitContext, chuỗi thoát khỏi miền đồng bộ hóa, cho phép chuỗi được chặn cuộc gọi đến bất kỳ thành viên nào của đối tượng cần tiếp tục. Khi phương thức Wait2ne trả về , chuỗi tạo cuộc gọi phải đợi đến nhập lại miền đồng bộ hóa.

14

Phần Nhận xét của trang MSDN có nội dung hoàn toàn giống như khóa học. Các bối cảnh thực thi là một chi tiết triển khai được ẩn trong .NET. Tôi sẽ chỉ cho bạn biết những gì tôi đảo ngược thiết kế mà không có thể hoàn toàn móng tay nó xuống.

Lối thoát Tiếp theo chỉ liên quan đến các tình huống truy cập từ xa.Bằng cách chuyển đúng, bạn cho phép cuộc gọi hiện tại bị tạm ngưng và một cuộc gọi khác được sắp xếp lại từ máy khách đến máy chủ. Bạn sẽ làm như vậy để cải thiện thông lượng, chọn đúng chỉ khi bạn mong đợi WaitOne() gọi một lúc. Những tác động chính xác của việc làm như vậy tuy nhiên không rõ ràng đối với tôi, cũng như không được ghi lại ở bất cứ đâu tôi biết. WaitOne() quá tải (không có thời gian chờ) luôn luôn vượt qua false, mà đặt một số căng thẳng về lời giải thích của tôi không may.

Một câu chuyện phụ đằng sau phương pháp này là nó rất kém hiểu rằng Microsoft đã quyết định phá vỡ tính tương thích ngược trong .NET 2. Họ đã thêm quá tải WaitOne (int) trong gói dịch vụ 2. Lỗi này cho phép thoát đối số. Điều này gây ra rất nhiều tình trạng lộn xộn, các lập trình viên bắt đầu sử dụng nó sau đó tìm thấy chương trình của họ thất bại khi chạy trên một phiên bản trước SP2 của .NET. Ouch.