Является ли System.ServiceModel.Channels.BufferManager поточно-ориентированным?
Я создаю менеджер буфера через статический член BufferManager.CreateBufferManager
, Этот новый созданный BufferManager
используется несколькими потоками.
Должен ли я использовать lock
с TakeBuffer()
а также ReturnBuffer()
или это поточно-ориентированный дизайн?
2 ответа
Внутренне BufferManager.CreateBufferManager
возвращает экземпляр WrappingBufferManager
который не использует никакой формы управления параллелизмом, но включает в себя несколько экземпляров SynchronizedPool<T>
которые используют внутреннюю блокировку, когда Take()
новый буфер. Так что судя по простоте WrappingBufferManager
Можно с уверенностью предположить, что любая блокировка с вашей стороны была бы избыточной, а возвращаемый класс фактически безопасен для потоков.
У меня возникли проблемы с потоками в BufferManager. Я создал собственный кодировщик сообщений в WCF, и, исходя из моих наблюдений, не всегда гарантируется, что менеджер буфера создается для каждого вызова. Поэтому байты повторно используются / возвращаются другими потоками, что портит мои данные.
Итак, чтобы ответить на ваш вопрос... Нет, они НЕ. Поскольку вы повторно используете один и тот же экземпляр, они не гарантируют поточно-ориентированный.