Страницы

Поиск по вопросам

воскресенье, 22 декабря 2019 г.

Как правильно остановить Thread?

#c_sharp #клавиатура


Язык C#, Visual Studio 2013. Скажите пожалуйста, как в консольном приложении обработать
нажатия клавиши, чтобы остановить работающий Thread? Не могу найти класса с соответствующим
событием, именно, для консольного приложения.
    


Ответы

Ответ 1



Никак. 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 за подсказки в комментариях, которые помогли значительно улучшить ответ.

Комментариев нет:

Отправить комментарий