2016-09-14 3 views
3

У меня есть программа, которая запускает поток сервера, в этом потоке я жду подключения пользователя, но иногда (если пользователь нажимает «E») Я хочу закрыть этот поток сервера, но он не работает , Я попыталсяУбить многопоточную нить сервера C#

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

здесь код сервера:

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

    } 

и я бегу это так:

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

Я хочу прекратить это, как я могу это сделать?

+0

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

ответ

2

Вам необходимо использовать CancellationTokenSource, чтобы сигнализировать о том, что ваша нить прекращается. Использование Thread.Abort не рекомендуется, так как оно завершает поток, не позволяя ему сначала очистить его.

Чтобы использовать маркер отмены, необходимо создать экземпляр CancellationTokenSource, а затем передать маркер вашей функции потока (или к объекту, который оборачивает новое состояние потока. Внутри функции потока вы можете проверить IsCancellationRequested свойство объекта лексема периодически, чтобы увидеть, если поток должен закрыть. Вы можете пройти один и тот же маркер отмены для функций ввода/вывода, так что они пытаются отменить операцию блокировки.

Read this question/ answers более подробно о возможных проблемах, вызванных Thread.Abort. в частности прочитайте ответ Эрика Липперта на этот вопрос, где он упоминает, что никогда не начинал нить, которую вы не можете вежливо остановить.

Смежные вопросы