2017-05-20 7 views
0

TCP接続をリッスンするwinformアプリケーションを作成しようとしていて、接続を受け取ると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()はスレッドの実行をブロックし、アプリケーションがハングしてしまう(Googleブロッキングソケット)。しかし、あなたは本当にそれをスレッドにする必要はありませんが、より多くのオプションがあります!

  1. のスレッディング。このコードブロックを別のスレッドで実行するだけです
  2. AcceptTcpClientAsyncこれはasync/awaitに基づいています。これには、コードの変更が必要ですが、
  3. /EndAcceptTcpClientです。これは物事を行う "古い"方法ですが、それは生きる価値があります。例はMSDN
関連する問題