2017-05-20 79 views
0

我想製作一個Winform應用程序,它將偵聽TCP連接,然後在接收到連接時執行X.TcpListener崩潰我的Windows窗體應用程序

,我遇到的問題是,它開始監聽應用進入「不響應」

這是我使用的代碼時:

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"); 
     } 

奇怪的是,就是它作爲控制檯應用程序工作得很好。

任何想法我做錯了什麼?

+0

accept()塊。您不能在GUI事件處理程序中阻止。把它關掉。 – ThingyWotsit

+0

表單項目不需要while循環。 while循環稱爲塊並阻止控制檯應用程序終止。表單項目在構造函數中包含一個塊,並且在代碼中不需要額外的塊。 – jdweng

+0

所以我可以刪除,而真的,它會運行好嗎? –

回答

1

正如@ThingyWotsit指出的,accept()阻止執行的線程,這會導致您的應用程序掛起(谷歌攔截套接字)。然而,你並不需要將它關閉,還有更多的選擇!

  1. 線程的。只需在單獨的線程中運行此代碼塊
  2. AcceptTcpClientAsync,它建立在async/await上。這需要修改代碼,儘管
  3. BeginAcceptTcpClient/EndAcceptTcpClient。這是一種「舊」的做事方式,但它應該活下去。一個例子可以在MSDN