2013-05-08 146 views
0

我正在客戶端應用程序和服務器應用程序之間進行簡單通信。C#應用程序在通過TCP進行通信時出現延遲

服務器:

TcpListener tcp = new TcpListener(IPAddress.Parse("192.168.1.66"),9000); 
tcp.Start(); 
TextBox.Text += "Start Listening \r\n"; //1 
Socket s = tcp.AcceptSocket(); 
TextBox.Text += "Client Has Connected \r\n"; 

滯後發生以下方式,串號1將不會出現,直到客戶端已連接,應用程序只凍結,我甚至無法拖動窗口。

我嘗試添加延遲:

TextBox.Text += "Start Listening \r\n"; 
System.Threading.Thread.Sleep(1000); 
Socket s = tcp.AcceptSocket(); 
TextBox.Text += "Client Has Connected \r\n"; 

不過這將不允許將被打印的第一消息,然後搜索套接字。應用程序一直處於凍結狀態,直到客戶端連接。

+2

您正在阻止您的UI線程。不要這樣做。閱讀此:http://stuff.seans.com/2009/05/21/net-basics-do-work-in-background-thread-to-keep-gui-responsive/ – 2013-05-08 17:58:33

+0

出於好奇,是否有一個使用普通套接字而不是'WCF'的具體原因是什麼? – PoweredByOrange 2013-05-08 17:59:26

+1

@ programmer93 - 如果他非常綠色,以至於他不瞭解線程阻塞,那麼WCF也會在他的腦海中變得方式過時。 – 2013-05-08 18:00:27

回答

0

你是否正在聆聽線程?如果沒有,你正在鎖定gui更新。

void StartListener() 
{ 
    System.Threading.Thread listenerThread = new System.Threading.Thread(ListenerThread)); 
    listenerThread.IsBackground = true; // Causes the thread to close if the app is closed 
    listenerThread.Start(); 
} 

void ListenerThread() 
{ 
    TcpListener tcp = new TcpListener(IPAddress.Parse("192.168.1.66"),9000); 
    tcp.Start(); 
    UpdateStatus("Start Listening \r\n"); //1 
    Socket s = tcp.AcceptSocket(); 
    UpdateStatus("Client Has Connected \r\n"); //1 

    // Listen for more messages, or close the listener here. 
} 

void UpdateStatus(string message) 
{ 
    if(InvokeRequired) 
     Invoke((MethodInvoker)delegate { UpdateStatus(message); }); 
    else 
     Textbox.Text = message; 
} 
+1

我喜歡它如何非安全版本的'UpdateStatus'調用本身以一種安全的方式。但是,更新委託內的文本框不是更容易嗎? – PoweredByOrange 2013-05-08 18:05:12

+0

是的,你可以。如果函數變大,我總是調用該方法。在這種情況下,它可以很容易地完成,所以是的。 – JeremyK 2013-05-08 18:06:55

相關問題