2011-11-21 28 views

Trả lời

26

ManualResetEventManualResetEventSlim cả hai đều được thiết kế sao cho chúng vẫn được báo hiệu sau khi gọi. Điều này thường cho một kịch bản rất khác so với AutoResetEvent.

AutoResetEvent ngay lập tức trở về trạng thái chưa được đánh dấu sau khi sử dụng, thường được sử dụng cho một nhóm kịch bản khác. Từ tài liệu AutoResetEvents:

Thông thường, bạn sử dụng lớp này khi các chủ đề cần quyền truy cập độc quyền vào tài nguyên.

ManualResetEvent (và Slim) thường được sử dụng, tuy nhiên, đối với một kịch bản mà:

giao tiếp này liên quan đến một công việc mà một thread phải hoàn thành trước khi chủ đề khác có thể tiến hành.

Thường được sử dụng trong các trường hợp có nhiều chủ đề chia sẻ tài nguyên, thời gian chờ thường sẽ không quá ngắn. Tuy nhiên, ManualResetEventSlim chỉ thực sự được dự định khi bạn biết, thời gian chờ đợi rất ngắn. Nếu thời gian chờ đợi của bạn sẽ không quá ngắn, bạn nên sử dụng ManualResetEvent để thay thế. Xem tài liệu trên difference between MRE and MRES để biết chi tiết.

Khi thời gian chờ của bạn dài hơn (đây là kịch bản bình thường với AutoResetEvent), phiên bản "mỏng" thực sự tồi tệ hơn, vì nó trở lại sử dụng tay cầm chờ.

10

Tôi cũng bị lỗi bởi thực tế này. Tuy nhiên có vẻ như bạn có thể mô phỏng một AutoResteEvent (Slim) sử dụng một SemaphoreSlim đơn giản với một cấu hình đặc biệt:

SemaphoreSlim Lock = new SemaphoreSlim(1, 1); 

Tham số đầu tiên (http://msdn.microsoft.com/en-us/library/dd270891(v=vs.110).aspx) định nghĩa tình trạng ban đầu của semaphore: 1 có nghĩa là một thread có thể nhập , 0 rằng semaphore phải được phát hành đầu tiên. Vì vậy, a = new AutoResetEvent(true) dịch sang số = new SemaphoreSlim(1, 1)a = new AutoResetEvent(false) chuyển thành = new SemaphoreSlim(0, 1) tương ứng.

Tham số thứ hai xác định số lượng chủ đề tối đa có thể nhập đồng thời semaphore. Đặt nó thành 1 cho phép nó hoạt động như một AutoResetEvent.

Một điều tốt đẹp khác về SemaphoreSlim là với mẫu async/await mới trong 4.5 lớp đã nhận được phương thức .WaitAsync() có thể được chờ đợi. Vì vậy, không cần phải tự tạo ra một nguyên thủy chờ đợi chờ đợi trong trường hợp này nữa.

Hy vọng điều này sẽ hữu ích.

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