Как прервать другой поток в .NET, когда указанный поток выполняет Console.ReadLine?

Мое консольное приложение выполняет поток, полностью посвященный пользовательскому интерфейсу, он тратит много времени на блокировку на Console.ReadLine () (этот вызов тратит свое время глубоко в недрах Windows, вне контроля .NET framework).

Мне нужно прервать этот поток. Однако следующий код, похоже, не работает:

this.UserInterfaceThread.Abort();

Есть идеи? d.Interrupt () может быть полезен?

Обновление

Как заметил Ханс Пассан:

CLR налагает довольно разумные правила на состояние потока, когда он прерывает его. Опасности Thread.Abort () хорошо известны, и что определенно не может работать надежно, так это прерывание потока, выполняющего неуправляемый код. Это тот случай, когда вы вызываете Console.ReadLine (), поток скрывается глубоко внутри кода операционной системы Windows.

Решение состоит в том, чтобы просто нажать клавишу [Enter] в текущем запущенном консольном приложении, которое разблокирует Console.ReadLine (), чтобы поток немедленно прервался.

Мы не можем использовать SendKeys, поскольку это характерно для оконных форм, а также требует, чтобы текущее окно имело фокус.

Решение состоит в том, чтобы использовать библиотеку на inputsimulator.codeplex.com , которая является оболочкой для вызова Windows SendInput ().

См. Пример кода:

Вызов .NET для отправки нажатия клавиши [ввод] в текущий процесс, который является консольным приложением?

10
задан Community 23 May 2017 в 12:14
поделиться