2012-04-19 72 views
3

我對此示例有個疑問:Asynchronous Client Socket。 它說,該操作是異步的,他們ARE(的BeginXXX/endxxx都),但他們使用ManualResetEvent如果我理解正確的示例代碼 - 這樣的電話:來自MSDN的異步客戶端套接字示例

Receive(client); 
    receiveDone.WaitOne(); 

會阻塞線程,他們被叫來。所以,如果我有一個用戶界面的應用程序,我從主線程調用異步套接字代碼 - 應用程序將凍結...或者我錯了嗎?對不起,我希望通過TCP異步發送/接收一些命令而不凍結主線程。我是否需要調用該示例中的所有套接字操作以避免凍結?

+0

這個例子是爲控制檯應用程序。我認爲它在GUI應用程序中更有意義,因爲您可以讓Receive回調將更新繪製到視圖上,並且僅在單擊按鈕(或其他事件)時調用Send函數。在這個例子中阻止的唯一原因是確保連接,發送,接收,關閉的線性事件,並且還可以防止程序在回調完成之前退出。 – styfle 2012-09-16 07:25:50

回答

2

是的,這個代碼設置,使其同步運行。但是,您可以自己輕鬆地使用Beginxxx和Endxxx調用,而不是在編寫異步操作的這個(可憐的)示例時將它們包裝起來。

爲了進一步澄清,文章不運行的每個方法以異步方式,但是如果使用blocker.WaitOne();一種更好的方法來這樣的事情可能是有你的beginconnect回調觸發發送,這將有它的回調塊觸發接收等

您也可以使用TPL並利用它們的ContinueWith功能來執行此操作。那麼你的代碼甚至可能看起來更乾淨:)

+0

謝謝;)將使用任務。我認爲MSDN提供了最佳實踐...... – 0x49D1 2012-04-19 14:42:38

+0

@ 0x49D1通常這是正確的,但是與生活中的所有事情一樣,你不應該同意某件事,因爲它來自某個特定的地方(你沒有,這很好: ))。此外,MSDN文章通常由外部人撰寫(我在這裏沒有看到),所以並不總是直接來自Redmond – 2012-04-19 14:46:05

1

它會阻止用戶界面。 MSDN示例確實表現出了異步性,但非常糟糕。它也是原始的。請看這個話題,我也只是回答了關於不同的異步編程模型。我討論了很多,並提供了所有例子的鏈接。

鏈接:Need help to implement multithreading in C#

+0

謝謝大家的答案..我害怕我的一些愚蠢的事情,事實證明我的理解正確。 @David Anderson,謝謝你的例子! – 0x49D1 2012-04-19 14:39:54

相關問題