Асинхронные методы SslStream всегда возвращают IAsyncResult, где CompletedSynchronously имеет значение True. Зачем? - PullRequest
4 голосов
/ 27 июля 2011

Я использую TcpClient BeginConnect для создания сокет-соединения с TCP-сервером. Это возвращает IAsyncResult, где CompletedSynchronously имеет значение false, что я и ожидал, по крайней мере, большую часть времени. Я обертываю сокеты NetworkStream в вызове SslStream BeginAuthenticateAsClient, который возвращает IAsyncResult, где CompletedSynchronously имеет значение true. Это действительно удивило меня, так как этот метод совершает многократные поездки на сервер, чтобы сделать рукопожатие. Каждый BeginWrite & BeginRead, который я делаю с этого момента, возвращает IAsyncResult, где CompletedSynchronously имеет значение true.

Я подозреваю, что реализация SslStream не поддерживает асинхронный ввод-вывод. Я собирался подтвердить это, перейдя на сервер без оболочки SSL, но, к сожалению, этот сервер требует SSL, поэтому я не смог.

Если SslStream не поддерживает асинхронность, я планирую обернуть SslStream потоком в памяти, а затем передать его в NetworkStream BeginRead / BeginWrite. К сожалению, я не смогу сделать асинхронное рукопожатие.

Кто-нибудь знает, действительно ли SslStream не поддерживает асинхронный ввод-вывод? Есть ли способ обойти это?

Спасибо.

дан

1 Ответ

3 голосов
/ 27 июля 2011

Я разбил SslStream на части, используя Отражатель , и я могу подтвердить, что, по крайней мере, BeginAuthenticateAsClient, BeginWrite и BeginRead все завершаются синхронно, как вы наблюдали. Метод обратного вызова, однако, помещается в ThreadPool, так что он поступает асинхронно, но фактическое чтение или запись уже завершено до возврата BeginWrite или BeginRead.

Странно то, что SslStream запускает все в асинхронном режиме, но затем ожидает завершения чтения или записи перед возвратом. Почему он это делает? Понятия не имею!

Не похоже, что есть какой-либо способ изменить это конкретное поведение SslStream.

...