2014-10-30 21 views
1

有沒有任何方法可以在沒有輪詢的情況下檢測TcpClient中可用的新數據?通過與TcpClient相關的事件或者用於讀取它的Stream。TcpClient收到數據時的事件

投票廢物資源。因此,的某處有一個可以訂閱的事件似乎是合乎邏輯的,以便通知服務器發送的新數據。沒有輪詢,沒有第三方庫,也沒有非託管代碼。只需簡單的管理內置.net。如果TcpClient是錯誤的工具 - 也沒關係 - 這個正確的類嗎?

+0

的問題不是ASP.NET或C#具體的我推薦那些標籤被移除 – usr 2014-10-30 10:53:04

+0

需要點但標籤可以幫助答覆者給出可以在這種情況下工作的答案(例如,也許有一個特殊的Asp.net類,我不知道)。關於該場景的標籤儘可能多 – ispiro 2014-10-30 10:56:52

回答

3

只需使用異步IO。異步IO基於回調,與事件非常相似。

在現代風格你會說類似await myNetworkStream.ReadAsync(...)。在該呼叫期間沒有線程被阻塞。如果這是你第一次聽到await這聽起來不可能,但它是真的。

回調在這裏是不可見的。在舊的APM模式是清晰可見:。

myNetworkStream.BeginRead(..., asyncResult => { /* callback code */ }); 

(在這些例子中我假設你已經從你的TcpClient獲得NetworkStream實例

+0

感謝您的回答,我沒有等待的經驗(雖然我聽說過它),你是說它會等到新的inf ormation被寫入Stream,然後才調用回調函數?或者你只是說它會讀取沒有阻止?從[MSDN](http://msdn.microsoft.com/en-us/library/system.net.sockets.networkstream.readasync%28v=vs.110%29.aspx) - 它看起來像後者。這不是我要找的。 – ispiro 2014-10-30 10:59:30

+0

異步讀取API與同步讀取API具有相同的合約。當有數據可用或流被耗盡時,操作完成。稍微糾正你的語言:寫入數據時讀取不完成。數據可用時讀取完成(到達時)。異步讀取永遠不會阻塞(就是這一點),但讀取僅在數據到達時(或流已結束)完成。然後,回調將被調用。 – usr 2014-10-30 11:03:45

+0

是的。我的意思是「寫」 - 由服務器。所以我認爲,如果沒有數據存在 - 這將等待它。好。我需要檢查一下。甚至是舊的'BeginRead'。如果沒有數據存在,我認爲它會簡單地返回null。 – ispiro 2014-10-30 11:07:32