Язык C#, Visual Studio 2013. Скажите пожалуйста, как в консольном приложении обработать нажатия клавиши, чтобы остановить работающий Thread? Не могу найти класса с соответствующим событием, именно, для консольного приложения.
Ответ
Никак. Thread должен сотрудничать, и сам останавливаться, когда его попросят.
Например, при помощи разделяемой переменной (но не забудьте о синхронизации при помощи lock):
object mutex = new object();
bool stop = false;
var t = new Thread(() =>
{
int i = 0;
while (true)
{
Thread.Sleep(500);
// тут сделать что-то полезное, например:
Console.WriteLine(i++);
// проверка на выход
lock (mutex)
{
if (stop)
break;
}
}
});
t.Start();
Console.ReadKey();
lock (mutex) stop = true;
t.Join();
Вот вам более современный метод, без Thread и Sleep, через Task и CancellationToken
static void Main(string[] args)
{
CancellationTokenSource cts = new CancellationTokenSource();
var task = Task.Run(() => Work(cts.Token));
Console.ReadKey();
cts.Cancel();
task.Wait(); // для асинхронной функции тут лучше await task
}
static async Task Work(CancellationToken ct)
{
try
{
int i = 0;
while (!ct.IsCancellationRequested)
{
await Task.Delay(500, ct);
Console.WriteLine(i++);
// после длинных операций внутри цикла имеет смысл вставлять
//if (ct.IsCancellationRequested)
// return;
}
}
catch (OperationCanceledException ex)
{
// нас останавливают, выходим
}
}
CancellationToken — это правильный метод передавать сообщения о завершении, используйте его по возможности.
Спасибо @rdorn и @Pavel Mayorov за подсказки в комментариях, которые помогли значительно улучшить ответ.
Комментариев нет:
Отправить комментарий