Остановка чтения консоли в другом потоке - PullRequest
1 голос
/ 10 марта 2011

Кто-нибудь знает, как остановить метод Console.ReadLine, когда он выполняется в другом потоке?

Сейчас я использую код (часть цикла), который работает следующим образом:

while (true)
{
    while (!Console.KeyAvailable) Thread.Sleep(100);
    string line = Console.ReadLine();
}

Это работает, но проблема в том, что, как только я наберу один символ, сервер не выключится.

Кто-нибудь знает, как этого добиться?(Также приветствуются совершенно разные подходы, поскольку это позволяет мне читать строки консоли после вызова метода Start () и останавливается после вызова метода Stop ().)

Ответы [ 3 ]

3 голосов
/ 10 марта 2011

Console.ReadLine звонки TextReader.ReadLine внутри страны. Это выходит, если основной поток закрыт. Если вы вызываете Console.In.Close() из основного потока, это может сработать, или вы не сможете закрыть поток ввода с консоли. Попробуйте и посмотрите.

Забудьте, Console.In.Close (), кажется, не работает.

Обновление

В этом посте есть все способы сделать что-то очень похожее: Как добавить Timeout в Console.ReadLine ()?

(удаленный код, потому что он не работал)

Еще одно обновление

Я провел еще несколько исследований, и вот что я нашел:

  • Консоль находится в режиме линии.

  • Пользователь не может вводить текст в режиме строки, пока не будут вызваны Read, ReadLine или Peek.

  • Чтение, чтение строки и просмотр блока до тех пор, пока пользователь не нажмет Enter.

  • Следовательно, мы не можем позволить консоли обрабатывать линейный ввод, или мы получаем проблему блокировки.

  • Таким образом, мы должны использовать KeyAvailable и ReadKey и сами управлять удалением и т. Д.

В этой статье приведен пример обработки ввода ReadKey: http://msdn.microsoft.com/en-us/library/system.consolekeyinfo.keychar.aspx

Если вы измените эту функцию, чтобы она всегда вызывала KeyAvailable перед вызовом ReadKey, и ненадолго спите, если нет ввода, вы можете избежать блокировки.

2 голосов
/ 10 марта 2011

Установите для свойства IsBackground значение true для потока, выполняющего этот цикл.Это должно позволить CLR корректно завершить работу приложения.

1 голос
/ 10 марта 2011

Используйте KeyAvailable и ReadKey вместо ReadLine.Или, возможно, вызовите Thread.Abort для потока потребителя консоли.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...