Мое консольное приложение выполняет поток, полностью посвященный пользовательскому интерфейсу, он тратит много времени на Console.ReadLine()
(этот вызов проводит свое время глубоко в недрах Windows, вне контроля платформы .NET) ,Как прервать другой поток в .NET, когда указанный поток выполняет Console.ReadLine?
Мне нужно отменить эту тему. Однако следующий код не работает:
this.UserInterfaceThread.Abort();
Любые идеи? Будет ли Thread.Interrupt() использоваться?
Update
Как Ганс Passant отметил:
Среда CLR устанавливает довольно вменяемые правила о состоянии нити, когда она ликвидирует его. Опасности Thread.Abort() хорошо известны, что, безусловно, никогда не может работать надежно, прерывает поток, который выполняет неуправляемый код. В этом случае, когда вы вызываете Console.ReadLine(), поток зарывается глубоко внутри кода операционной системы Windows.
Решение состоит в том, чтобы просто нажать клавишу [enter] в текущее консольное приложение, которое блокирует Console.ReadLine(), поэтому поток немедленно прерывается.
We не может использовать SendKeys, поскольку это специфично для оконных форм, а также для того, чтобы текущее окно имело фокус.
Решение состоит в использовании библиотеки в inputsimulator.codeplex.com, которая завершает вызов Windows SendInput().
См пример кода:
.NET call to send [enter] keystroke into the current process, which is a console app?
Возможный дубликат [Как добавить тайм-аут в Console.ReadLine()?] (Http://stackoverflow.com/questions/57615/how-to-add-a-timeout-to-console-readline) –
'Thread.Abort' [is evil] (http://www.interact-sw.co.uk/iangblog/2004/11/12/cancellation). – spender
@ Darin Dimitrov: Это не дубликат. Этот вопрос касается того, как прервать поток, который запускает один экземпляр Console.ReadLine(). – Contango