我使用 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?有没有解决方法来解决它?

谢谢。

最佳答案

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

奇怪的是,SslStream 似乎在异步模式下让一切都进行了,但在返回之前等待读取或写入完成。它为什么这样做?我不知道!

似乎没有任何方法可以改变 SslStream 的这种特定行为。

关于c# - SslStream 异步方法始终返回 IAsyncResult,其中 CompletedSynchronously 为 True。为什么?,我们在Stack Overflow上找到一个类似的问题:https://stackoverflow.com/questions/6846962/

10-12 20:00