2013-02-11 76 views
0

我有一個運行TCP/IP服務器和客戶端的C#WinForm。當點擊按鈕時,TCP客戶端被實例化以發送消息,然後它被關閉。服務器捕獲消息並在消息框中顯示它。導致WinForm響應慢的TCP/IP

問題:
我的WinForm似乎被中斷。它並不總是響應我的點擊(它實例化客戶端消息傳輸方法)。我想這是由於服務器線程?如果是的話,我能做些什麼來解決這個中斷問題。

回答

1

聽起來你的網絡正在UI線程中發生。這是一個很大的問題:UI線程是爲了保持對用戶事件的響應。

你應該把你的網絡放到一個單獨的線程中,或者使用異步API。不要忘記,你只能從UI線程更新你的用戶界面 - 所以你通常使用BackgroundWorker在UI線程上報告進度/完成,或者使用Control.Invoke/Control.BeginInvoke在UI線程上執行一個委託。你可以閱讀各種書籍和教程中的線程 - 我喜歡Joe Albahari's tutorial

如果您使用.NET 4.5/C#5,您可以使用異步調用使您的生活變得更加輕鬆 - 但是如果您使用.NET的早期版本,則使用單獨的線程可能是會變得更簡單。

+0

我確實把我的服務器方法放在一個單獨的線程上,該線程持續運行並在Form_Closing()上關閉。但是,客戶端方法不在任何線程上。它只是一個TCP客戶端的實例。你能告訴我哪個是造成問題的問題嗎? – CaTx 2013-02-11 15:34:07

+0

@hoangnguyen:*所有*代碼在一個線程上運行。你所做的一切都在一個線程上。聽起來問題在於你正在創建'TcpClient',然後發送一個阻塞調用的消息。 (目前還不清楚你是將數據發送給「你自己」(即同一臺服務器)還是另一個數據。) – 2013-02-11 15:39:11

+0

是的,我正在使用阻塞方法發送。它是TcpClient.Connect()和NetworkStream.Write()。我發送給自己(本地主機)。我應該在一個單獨的客戶端線程上封裝這個方法嗎 – CaTx 2013-02-11 15:42:19