2011-04-17 27 views
8

Tôi tạo trình quản lý bộ đệm thông qua thành viên tĩnh của BufferManager.CreateBufferManager. Điều này tạo ra BufferManager mới được sử dụng bởi nhiều chủ đề.Là System.ServiceModel.Channels.BufferManager thread-safe?

Tôi có nên sử dụng một lock với TakeBuffer()ReturnBuffer() hoặc nó là thread-an toàn bằng cách thiết kế?

Trả lời

4

Bên BufferManager.CreateBufferManager trả về một thể hiện của WrappingBufferManager mà sử dụng không có hình thức kiểm soát đồng thời, nhưng kết thúc tốt đẹp nhiều trường hợp của SynchronizedPool<T> có sử dụng khóa nội bộ khi Take() ing một bộ đệm mới. Vì vậy, đánh giá bởi sự đơn giản của các WrappingBufferManager, nó an toàn để giả định rằng bất kỳ khóa trên một phần của bạn sẽ được dự phòng, và lớp trả về là trong thực tế thread thực tế an toàn.

0

Tôi gặp phải sự cố về luồng với Trình quản lý bộ đệm. Tôi tạo ra một bộ mã hóa thông điệp tùy chỉnh trong WCF, và dựa trên quan sát của tôi, nó không phải lúc nào cũng được đảm bảo rằng trình quản lý bộ đệm được tạo ra cho mỗi cuộc gọi. Vì vậy, byte đang được tái sử dụng/trả về bởi các chủ đề khác, do đó làm hỏng dữ liệu của tôi.

Vì vậy, để trả lời câu hỏi của bạn ... Không, chúng là NOT. Vì bạn đang sử dụng lại cùng một trường hợp, chúng không được bảo đảm thread-safe.

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