2012-12-27 154 views
0

我下面的TCP客戶機/服務器的這個例子TCP客戶機/服務器

www.codeproject.com/Articles/1415/Introduction-to-TCP-client-server-in-C

我比較熟悉的WinForms比控制檯應用程序,所以我決定重拍中的WinForms代碼。我有相同形式的客戶端和服務器代碼。在初始化服務器時,表單在我使用AcceptSocket()後停滯不前,並且我無法使用按鈕從客戶端發起操作。這是否意味着我必須在單獨的WinForms中編寫客戶端和服務器? =/

回答

2

你需要能夠讀取插座不佔用你的UI線程。否則,窗口顯示無響應。

你有兩個選擇。第一種,表面上最簡單的是,如前所述明確使用線程。

第二種是使用接受/讀取/寫入函數的異步版本之一(BeginXXX/EndXXXXXXAsync,取決於您使用的API),它從線程池爲您啓動另一個線程。 (該Async版本居然沒有搶到一個線程直到事件發生,而Begin/End可能會立即搶單。)除非你確實需要奉獻一個新的線程來觀看插座(你幾乎從來沒有真正做),我d更喜歡異步的東西。

無論哪種方式,你會想了解多線程一點。在這種情況下,你需要記住的大事情是(1)無論你如何做,你的套接字的東西幾乎肯定會在另一個線程上發生;和(2)WinForms控件討厭直接從其他線程訪問;你需要使用他們的Invoke方法來改變UI線程上的東西。

+0

到目前爲止,WinForm確實顯得沒有反應。想知道你是怎麼知道的? =/ – CaTx

+0

@hoangnguyen:主要是試錯。 :)我見過它發生。實際上,控制檯應用也會發生;如果你想閱讀,並在同一個線程寫(SANS'Socket.Select'),你就會看到類似的醜陋。 – cHao

+0

THX超,看起來像我步入多線程現在。 – CaTx

3

您需要在單獨的線程運行。確保您不會阻止UI線程,否則UI將無法響應。

+0

這意味着我可以在一個表上運行呢?如果我對線程不熟悉,是否意味着我需要兩個表單來簡化它? =/ – CaTx

+0

我該如何避免阻塞UI線程? – CaTx