SslStream:使用可用的检查数据来执行轮询IO

时间:2013-08-31 14:07:25

标签: vb.net asynchronous stream sslstream

前段时间我在vb.net上写了一些基本的Http网络服务器。 我试图避免阻止IO,所以基本上我为所有当前连接创建了一个轮询线程。

While True
    For Each oNetworkstream In lstNetworkstream
        If oNetworkstream.DataAvailable Then
            'Read from stream
        End If
    Next
End While

因此,只要连接有一些新数据,我就可以读取它,否则立即检查下一个连接。

现在我正在使用https扩展网络服务器。 因此,我使用.Net SslStream类。 我想应用相同的原则(一个轮询线程来读取所有流)

由于没有.DataAvailable属性,我试过宽度.Length> 0, 但这会产生NotSupportedException(此流不支持搜索操作)

Dim oSslStream As New SslStream(oStream, False)
oSslStream.AuthenticateAsServer(moCertificateKeyPair)
MsgBox(oSslStream.Length)

那么,我怎样才能确定某个解密流是否有数据可用而不会阻塞该线程?

1 个答案:

答案 0 :(得分:0)

当你有很多连接时,避免阻塞是一个好主意。但民意调查不是解决问题的方法。

相反,您应该使用异步IO。当数据准备就绪时,让系统通知您。

使用C#5,您应该使用async/await + ReadAsync。在较低的C#版本中,您应该使用基于任务的IO(IOW仍然使用ReadAsync可用)。如果它不可用,请编写您自己的版本。如果您不能这样做,请使用BeginRead