SslStream异步方法始终返回IAsyncResult,其中CompletedSynchronously为True。为什么?

时间:2011-07-27 15:26:43

标签: c# .net ssl asynchronous

我使用TcpClient BeginConnect创建到TCP服务器的套接字连接。这将返回一个IAsyncResult,其中CompletedSynchronously为false,这是我至少在大多数时候所期望的。我将套接字NetworkStream包装在SslStream调用BeginAuthenticateAsClient中,它返回一个IAsyncResult,其中CompletedSynchronously为true。这真让我感到惊讶,因为这种方法可以多次往服务器进行握手。每个BeginWrite& BeginRead我从那时开始返回一个IAsyncResult,其中CompletedSynchronously为真。

我怀疑SslStream的实现不支持异步IO。我打算通过没有SSL包装器的服务器来确认这一点,但遗憾的是服务器需要SSL,所以我不能。

如果SslStream不支持异步,我计划将SslStream包装在内存流中,然后将其传递给NetworkStream BeginRead / BeginWrite。不幸的是,我无法进行握手异步。

有人知道SslStream是否实际上不支持异步IO?是否有解决方法来实现它?

感谢。

1 个答案:

答案 0 :(得分:3)

我使用ReflectorSslStream分开,我确认至少BeginAuthenticateAsClientBeginWriteBeginRead同步完成如你所观察到的那样。然而,回调方法被推送到ThreadPool,以便异步进入,但实际的读或写已经在BeginWriteBeginRead返回之前完成。

关于这一点的奇怪之处在于SslStream似乎在异步模式下完成所有操作,但在返回之前等待读取或写入完成。为什么这样做?我不知道!

似乎没有办法改变SslStream的这种特殊行为。