2017-05-20 9 views
0

Ich versuche, eine Winform-App zu machen, die auf eine TCP-Verbindung wartet, und dann X, wenn sie eine Verbindung erhält.TcpListener stürzt meine Windows Form App ab

Das Problem, das ich habe, ist, dass, wenn es beginnt die App in „nicht reagiert“

Dies ist der Code Ich verwende geht hören:

try 
     { 
      // set the TcpListener on port 13000 
      int port = 13000; 
      TcpListener server = new TcpListener(IPAddress.Any, port); 

      // Start listening for client requests 
      server.Start(); 

      //Enter the listening loop 
      while (true) 
      { 
       MessageBox.Show(@"Waiting for a connection... "); 

       server.AcceptTcpClient(); 

       MessageBox.Show(@"Connected"); 
       // ProcessStartInfo proc = new ProcessStartInfo(); 
       // proc.WindowStyle = ProcessWindowStyle.Hidden; 
       // proc.FileName = "cmd"; 
       // proc.Arguments = "/C shutdown -f -r"; 
       // Process.Start(proc); 

      } 
     } 
     catch (SocketException) 
     { 
      MessageBox.Show(@"SocketException"); 
     } 

Das Merkwürdige ist, ist es funktioniert gut als eine Konsolen-App.

Irgendwelche Ideen, was ich falsch mache?

+0

accept() - Blöcke. Sie können in einem GUI-Ereignishandler nicht blockieren. Fädeln Sie es ab. – ThingyWotsit

+0

Ein Formularprojekt benötigt keine while-Schleife. Die while-Schleife wird Block genannt und verhindert, dass die Konsolenanwendung beendet wird. Ein Formularprojekt enthält einen in den Konstruktor integrierten Block und benötigt keinen zusätzlichen Block in Ihrem Code. – jdweng

+0

So kann ich nur entfernen, während wahr, und es wird in Ordnung laufen? –

Antwort

1

Wie @ThingyWotsit wies darauf hin, accept() blockiert den Thread aus der Ausführung, die dazu führt, dass Ihre Anwendung hängt (Google Blocking-Sockets). Sie müssen es jedoch nicht wirklich entfernen, es gibt mehr Optionen!

  1. Einfädeln von. Führen Sie diesen Codeblock einfach in einem separaten Thread
  2. AcceptTcpClientAsync aus, der auf async/await aufgebaut ist. Dies erfordert Codeänderungen, obwohl
  3. BeginAcceptTcpClient/EndAcceptTcpClient. Dies ist eine "alte" Art, Dinge zu tun, aber es verdient zu leben. Ein Beispiel findet sich unter MSDN
Verwandte Themen