不久前,我在vb.net中编写了一些基本的Http Web服务器。我尽量避免阻塞IO,所以基本上我为所有当前连接创建了一个轮询线程。
While True
For Each oNetworkstream In lstNetworkstream
If oNetworkstream.DataAvailable Then
'Read from stream
End If
Next
End While
因此,每当一个连接有一些新数据时,我都可以读取它,否则立即检查下一个连接。
现在我正在使用https扩展Web服务器。因此,我使用了.Net SslStream类。我想应用相同的原理(一个轮询线程读取所有流)
由于没有.DataAvailable属性,我尝试width.Length>0,但这会产生NotSupportedException(此流不支持寻道操作)
Dim oSslStream As New SslStream(oStream, False)
oSslStream.AuthenticateAsServer(moCertificateKeyPair)
MsgBox(oSslStream.Length)
那么,我如何在不阻塞线程的情况下确定某个解密流是否有可用的数据呢?
当您有很多连接时,避免阻塞是个好主意。但民意调查并不是解决问题的方法
相反,您应该使用异步IO。让系统在数据准备就绪时通知您。
对于C#5,您应该使用async/await
+ReadAsync
。在较低的C#版本中,您应该使用基于任务的IO(IOW仍然使用ReadAsync
是可用的)。如果不可用,请编写自己的版本。如果不能做到这一点,请使用BeginRead
。