2013-10-28 42 views
2

我已經試過TcpClient的連接凍結如果的TCPListener不可

Connectionclient.ReceiveTimeout = 10000; 
    Connectionclient.Connect("127.0.0.1", 10072); 

如果的TcpListener運行時,它工作正常。 但如果TcpListener沒有運行,我的tcpclient會在捕獲異常之前像1秒一樣凍結它自己。同時,我的連接消息也被凍結。

我只是想讓一個登錄屏幕像所有網絡遊戲一樣。

那麼,我該如何解決這個問題,或者我該怎麼去閱讀才能找到解決方案。

回答

3

TcpClient.Connect方法是同步,因此將調用線程,直到連接操作已經完成或者成功或者錯誤。

如果調用線程碰巧是擁有窗口句柄的線程,那麼該窗口將顯示爲無響應。

爲了解決您的問題,您可以使用異步對應的同步連接方法,該方法將在單獨的工作線程上執行連接操作。

labelConnectionState.Text = "Connecting"; 
Connectionclient.BeginConnect("..", 43594, ConnectCallback, Connectionclient); 
... 
private static void ConnectCallback(IAsyncResult asyncResult) 
{ 
    try 
    { 
     TcpClient Connectionclient = (TcpClient) asyncResult.AsyncState; 
     Connectionclient.EndConnect(asyncResult); 
     labelConnectionState.Text = "Connected"; 
    } 
    catch (SocketException socketException) 
    { 
     labelConnectionState.Text = "Server unavailable"; 
    } 
}