2011-09-18 50 views
4

可能重複:
Difference between NetworkStream.Read() and NetworkStream.BeginRead()?何時處理TcpClients時使用異步?

與TcpClient類搞亂了一下,我注意到TcpClient.GetStream()類有兩種Read()BeginRead() and EndRead()功能。

我應該使用哪些?我意識到Begin和End函數是異步函數,但我應該使用它們嗎?在什麼情況下我會使用Read與其異步對應?寫什麼?

目前,我只是在做這樣的事情:

byte[] message = new byte[4096]; 
int bytesRead = clientStream.Read(message, 0, 4096); 

我應該使用的BeginRead和EndRead呢?

回答

3

同步和異步方法之間的選擇本質上是您的應用程序的線程模型的選擇。由於對於大多數應用程序來說,在用戶執行其他任務時(例如訪問網絡,如有問題),對用戶無響應是不可接受的,因此您需要提供一種方法來在工作完成時響應用戶輸入。

這兩個最普遍的選擇是

  1. 爲了使應用程序的多線程,有效地允許它在同一時間
  2. 要使用小塊異步回調和處理工作做多件事情同時在處理這些塊之間響應用戶

例如ReadBeginRead對應於上述選項1和2之間的選擇(我假設如果使用阻塞方法,如Read,則需要在與UI上運行的線程不同的線程上執行此操作,因此在技術上不需要, 在實踐中使用阻塞調用的應用程序將是多線程的)。

如果您不完全理解我在說什麼,請使用同步調用,因爲它會更容易。如果(當)您的應用程序開始無響應時,您將有機會在以後重新考慮您的方法。

+0

我明白你在說什麼。看起來Async總是更好,但實施起來更加困難,但一旦到位,它就是一個更好的系統。是? –

+0

@KylePrice:我會毫不猶豫地說「永遠更好」。它的確更具可擴展性,但有阻止呼叫的合法場景(也請記住我給出了一個非常普遍的答案,因爲這個問題也非常普遍)。是的,它通常會更復雜一點。 – Jon

+0

什麼是合法場景的例子?在不需要更新GUI的服務器上讀取少量數據? –