2011-04-28 49 views
0

由於NetworkStream.Write()是一個阻塞調用,應該像SendMessage()這樣的方法創建一個新的線程來執行寫入操作,或者應該阻止該方法直到消息被髮送或發生異常?應該寫入NetworkStream是否異步執行

我的直覺告訴我,這是合理的封鎖此方法,但看着really nice example of sockets in C#我發現他們正在創造一個新的線程。我看到創建另一個線程的主要問題是錯誤處理。

PS:我知道寫,讀的異步版本等等,但發現IAsyncResult的相當混亂,我目前持觀望態度使用這些選項。

+0

我真的只會學習使用該方法的異步版本。如果您需要做異步Web請求,它將在以後幫助您,因爲模型是相同的。另外如果你想轉移到Silverlight開發,他們只提供一些功能的異步方法。 – RedDeckWins 2011-04-28 06:50:34

回答

4

如果您是在UI線程調用SendMessage()那麼它會阻止它和你的應用程序將「凍結」。相反,你要發送的數據,在.NET 4.0中

如果您的應用程序服務客戶端使用ThreadPool.QueueUserItem(o => SendMessage())Task.Factory.StartNew(() => SendMessage())Task Parallel Library和您爲每個客戶端的新線程每次創建一個新的線程,然後SendMessage()可以,如果你阻止在將數據發送到客戶端時不想做其他工作。

創建爲每一個客戶一個新的線程有一個缺點:大量的線程會消耗大量的資源和最,而他們可能會在此期間被服務的其他客戶,這些線程將被閒置的時間。如果你想創建一個高性能的服務器應用程序,你應該學習異步編程。

結賬Async CTP。它可以讓你寫異步代碼,看起來像同步的代碼,而不凌亂回調

public async void SendMessage() 
{ 
    try { 
     await socket.WriteAsync(buffer, 0, buffer.Length); 
    } catch (...) { 
     // handle it 
    } 
} 

現在的SendMessage()不會阻止,因爲它會被異步執行,它看起來並不嚇人了!

0

我強烈建議你看一看的Task Parallel Library

您可以使用當前.net中的任何異步模式創建任務。

任務將在線程池來執行,異常會親切的其他線程編組。