我使用 TcpClient BeginConnect 创建到 TCP 服务器的套接字连接。这将返回一个 IAsyncResult,其中 CompletedSynchronously 为 false,这至少在大多数情况下是我所期望的。我将套接字 NetworkStream 包装在 SslStream 调用 BeginAuthenticateAsClient 中,该调用返回 IAsyncResult,其中 CompletedSynchronously 为 true。这真的让我感到惊讶,因为这种方法会多次往返服务器以进行握手。从那时起,我所做的每个 BeginWrite 和 BeginRead 都会返回一个 IAsyncResult,其中 CompletedSynchronously 为 true。
我怀疑 SslStream 的实现不支持异步 IO。我打算通过在没有 SSL 包装器的情况下访问服务器来确认这一点,但不幸的是,该服务器需要 SSL,所以我不能。
如果 SslStream 不支持异步 io,我计划将 SslStream 包裹在内存流周围,然后将其传递给 NetworkStream BeginRead/BeginWrite。不幸的是,我将无法进行异步握手。
有人知道 SslStream 实际上是否不支持异步 IO?有没有解决方法来解决它?
谢谢。
担
最佳答案
我使用 Reflector 将 SslStream
分开,我可以确认,至少, BeginAuthenticateAsClient
、 BeginWrite
和 BeginRead
全部同步完成,正如您所观察到的。然而,回调方法被推送到 ThreadPool
上,以便异步进入,但实际读取或写入在 BeginWrite
或 BeginRead
返回之前已经完成。
奇怪的是,SslStream
似乎在异步模式下让一切都进行了,但在返回之前等待读取或写入完成。它为什么这样做?我不知道!
似乎没有任何方法可以改变 SslStream
的这种特定行为。
关于c# - SslStream 异步方法始终返回 IAsyncResult,其中 CompletedSynchronously 为 True。为什么?,我们在Stack Overflow上找到一个类似的问题:https://stackoverflow.com/questions/6846962/