2013-08-31 43 views
1

前一段時間,我在vb.net寫了一些基本的Http網絡服務器。 我試圖避免阻塞IO,所以基本上我爲所有當前連接做了一個輪詢線程。SslStream:使用檢查數據可用來執行輪詢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財產,我想寬度。長度> 0, 但是這給NotSupportedException異常(該流不支持尋道操作)

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

所以,我怎麼能確定是否有一定的解密流有可用的數據,而不會阻塞線程?

回答

0

當你有很多連接時避免阻塞是一個好主意。但是投票並不是解決問題的方法。

而應該使用異步IO。當數據準備就緒時,讓系統通知您。

對於C#5,您應該使用async/await + ReadAsync。在較低的C#版本中,應該使用基於任務的IO(IOW仍然使用ReadAsync可用)。如果它不可用,請編寫您自己的版本。如果你不能這樣做,請使用BeginRead

+0

我的印象是ReadAsync會在後臺使用它自己的線程來等待數據。那麼,最後,這會讓我有幾十個線程?我錯了嗎? – jnv

+0

異步IO根本不使用線程。 IO只是一個內核數據結構。如果它使用的是線程,則整個IAsyncResult模型都是無用的。 – usr

相關問題