2017-05-20 46 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