2013-05-08 1 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/ –

+0

그냥 호기심에서, 거기에 'WCF'보다는 평범한 소켓을 사용하는 특별한 이유? – PoweredByOrange

+1

@ programmer93 - 그가 너무 녹초가되어서 스레드 차단을 이해하지 못한다면 WCF도 머리로 쓰일 것입니다. –

답변

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

+0

예, 가능합니다. 함수가 커지면 항상 메소드를 호출합니다. 이 경우 쉽게 수행 할 수 있으므로 예. – JeremyK

관련 문제