2016-09-14 4 views
3

私はユーザスレッドを開始するプログラムを持っていますが、そのスレッドではユーザ接続を待ちますが(ユーザが "E"を押すと)そのサーバスレッドを終了したいのに動作しません。私はそれをどのように行うことができ、私はそれを終了したいマルチスレッドを停止するサーバのスレッドをC#

this.server = new Thread(start); 
server.Start(); 

private void start() 
    { 
     try 
     { 
      this.serverSocket = new TcpListener(8888);      // creating the Server TCP socket 
      this.clientSocket = default(TcpClient);       // creating the User socket variable 

      // starting the server 
      this.serverSocket.Start(); 

      Console.WriteLine("->> server started");      // printing to log 

      // for always 
      while (true) 
      { 
       counter += 1;            // new user 
       this.clientSocket = this.serverSocket.AcceptTcpClient(); // accepting user 
       Console.WriteLine(" ->> User connected");     // printing to log 
       // User creatinon 
       ConnectedUser user = new ConnectedUser(this.clientSocket); 
       user.startListerner(); 
      } 

      this.clientSocket.Close(); 
      this.serverSocket.Stop(); 
      Console.WriteLine(" >> " + "exit"); 
      Console.ReadLine(); 
     } 
     catch 
     { 
      Console.WriteLine("Error launching the Server"); 
     } 

    } 

と私はそれを実行し、この方法:私はそれはサーバーのコードここ

'thread'.abort() - but it's freezing and not stopping the thread 

を試してみましたか?

+0

http://stackoverflow.com/questions/2251964/c-sharp-thread-termination-and-thread-abort – xxbbcc

答えて

2

スレッドを終了するように通知するには、CancellationTokenSourceを使用する必要があります。 Thread.Abortを使用することは、スレッドを適切にクリーンアップせずにスレッドを終了させるため、お勧めしません。

キャンセルトークンを使用するには、CancellationTokenSourceのインスタンスを作成し、スレッド関数(または新しいスレッド状態をラップするオブジェクト)にトークンを渡します。スレッド関数の内部では、IsCancellationRequestedのプロパティを確認できます。トークンを定期的に参照してスレッドをシャットダウンするかどうかを確認してください。I/O関数に同じ取り消しトークンを渡してブロック操作を取り消すことができます。Thread.Abortによって引き起こされる可能性のある問題の詳細は、this question/ answersを参照してください。その質問に対するEric Lippertの反応を読んで、丁寧に止めることができないスレッドを決して開始しないと言います。

関連する問題