2014-05-30 3 views
1

У меня есть соединение с IRC-сервером через TCP. До сих пор я читал данные с независимой задачей. Однако, если я хочу выйти из программы, я не могу выйти из потока, потому что он застрял в read.ReadLine() команда (threadShouldRun не имеет никакого влияния). Использование Interrupt() или Abort() тоже ничего не меняет.Пытается прервать поток, застрявший в reader.readLine()

Либо мне нужно, чтобы определить, когда есть больше строк для чтения, или мне нужно принудительно убить поток (хотя это плохо).

private System.Threading.Thread myThread; 
private bool threadShouldRun = true; 
private StreamReader reader; 

private void readStream() 
{ 
    while(threadShouldRun) 
    { 
     string line = reader.ReadLine(); 
     if (line != null) 
     { 
      newLineEvent(this, new NewLineEventArgs(line)); 
     } 
    } 
} 
+0

Вы делаете это неправильно - если вы получили TCP сообщение, которое вы должны реагировать - вы должны использовать сокеты. Я не думаю, что вы сможете изящно закончить ожидание 'ReadLine'. –

+0

Довольно непонятно, что читает * читатель *. Но если это сетевой поток, вы можете просто остановить его, закрыв сокет. Будьте готовы поймать исключение. –

ответ

1

Раствор должен был бы установить TimeOut на вашем приемном сокетом (http://msdn.microsoft.com/it-it/library/system.net.sockets.socket.receivetimeout(v=vs.110).aspx).

Как только время истечет, будет поднят SocketException, чтобы вы могли его поймать и повторить контроль над вашим threadShouldRun.

В случае, если вы хотите бросить курить (и, следовательно, установить threadShouldRun ложь), есть два сценария:

  1. Данные, полученные, вы будете обрабатывать его, и на следующей проверки переменной будет найдено ложным и поток прекратится;
  2. Нет Получено данных, TimeOut, Исключение возникает, вы будете обрабатывать его, и при проверке поток завершится.
Смежные вопросы