2012-03-17 1 views
8

Я использую NetworkStream.BeginRead для асинхронного чтения с Socket.Безопасно ли обернуть NetworkStream с помощью BufferedStream для чтения async?

Но это намного быстрее, если вы фактически оберните сетевой поток BufferedStream.

Мой вопрос: NetworkStream.BeginRead внутренне вызывает Socket.BeginReceive и весь стек async IO (CompletionPorts на Windows и т. Д.). То же самое происходит, когда BufferedStream находится посередине?

+0

Есть ли что-нибудь видимое/понятное из рефлектора? – remio

+0

Он не реализует асинхронные вызовы (BufferedStream), поэтому я не уверен, будет ли он каким-либо образом идти к NetworkStream или базовому потоку, который может выполнять асинхронный, но afaik не использует IOCP – pablo

ответ

2

BufferedStream не поддерживает эффективный асинхронный ввод-вывод. Он использует реализацию по умолчанию, унаследованную от класса Stream. Он выдаст синхронные IO в пуле потоков. Таким образом, вы не получите порты ввода-вывода ввода-вывода. Вам нужно сделать эту работу самостоятельно. Если вы используете C# 5, вы можете почти повторно использовать реализацию BufferedStream и попытаться пощекотать aync и ждать на нем.

+0

. На чем это основано? Рассматривая источники BufferedStream, кажется, что асинхронные операции выполняются правильно, вызывая операции async в базовом потоке? –

+0

Он основан на .NET 4.0. В 4.5 это уже не так. Хорошая точка зрения. – usr

+0

Ах, спасибо за разъяснение. –