我使用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?是否有解决方法来实现它?
感谢。
丹
答案 0 :(得分:3)
我使用Reflector将SslStream
分开,我确认至少BeginAuthenticateAsClient
,BeginWrite
和BeginRead
同步完成如你所观察到的那样。然而,回调方法被推送到ThreadPool
,以便异步进入,但实际的读或写已经在BeginWrite
或BeginRead
返回之前完成。
关于这一点的奇怪之处在于SslStream
似乎在异步模式下完成所有操作,但在返回之前等待读取或写入完成。为什么这样做?我不知道!
似乎没有办法改变SslStream
的这种特殊行为。