簡體   English   中英

.NET中的異步TCP通信

[英]Asynchronous TCP Communication in .NET

這里的快速問題:使用與NetworkStream類(由TcpClient生成)的異步通信有什么明顯的好處,即BeginRead / BeginWrite方法,而不是運行單獨的線程並對其使用同步操作,即讀/寫? 我的印象是(很可能是非常錯誤的)異步操作是非阻塞的並且在OS級別(在TCP堆棧中執行?)執行,並帶有回調的線程池項。 我認為它肯定必須與在同步方法上調用ThreadPool.QueueUserWorkItem不同,或者提供它時沒有什么意義。 現在,我相信這至少是文件I / O所發生的事情(操作系統級調用),但如果有人可以澄清有關網絡(TCP)通信的問題,那將是最有幫助的。 基本上,我想知道這兩種方法是否有任何特定的好處(除了能夠在同步調用中使用BinaryReader / StreamReader類的明顯優勢)。

不同之處在於,如果使用Worker線程調用同步版本,則會阻塞阻塞調用中的一個線程。

雖然Begin方法不會占用線程,但會在適當的I / O信號上使用回調,然后回調將在池中的線​​程上運行。

正如其他人所指出的那樣,當您使用同步方法增加同時連接數時,將另一個線程分配給您的進程會對您產生影響。

但是,如果你知道你只會有少量連接,我會說它變成了一個清洗,你應該選擇最適合你應用的方法。

在線程開銷可以忽略不計的情況下,我希望這兩個場景能夠像這樣發揮作用。

異步:

  1. 您調用BeginRead / BeginWrite
  2. “系統”(框架/ OS)被告知您想要什么
  3. 讀/寫完成
  4. “系統”告訴線程池中的線程調用您的回調
  5. 您可以做任何您需要做的事情來完成操作

在另一個線程中同步:

  1. 您從線程池中獲取一個線程來處理IO
  2. 你打電話給讀/寫
  3. “系統”(框架/ OS)被告知您想要什么
  4. 讀/寫完成
  5. 您可以做任何您需要做的事情來完成操作

這里唯一的區別是異步調用的第4步在另一個線程情況下成為同步中的第1步。

我同意AnthonyWJones,想象你的線程池有10個線程,但你有100個被動的enought客戶端。 使用異步調用,您可以為每一個調用BeginRead,並且當某個數據准備就緒時,它將由其中一個池線程處理。 但是,如果您嘗試使用QueueUserWorkItem,則只會安排從10個客戶端接收數據。 如果他們在1小時內沒有發送任何內容,其他90個客戶將永遠無法獲得數據。

我不確定為什么NetworkStream甚至有一個BeginRead / Write,因為這基本上違反了NetworkStream的目的。 通過使用Async方法,您可以獲得更快的響應,更高的可伸縮性和更少的資源消耗。

如果你一次只有一個連接,那么如果你使用一個線程池線程沒關系,但是如果你接受了很多連接,那么你肯定想要使用異步。

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM