Прервать ожидание Thread.Sleep - C#
Формулировка задачи:
Можно ли прервать ожидание Thread.Sleep?
У меня сейчас в отдельном потоке выполняется некий код, при нажатии кнопки стоп меняется переменная bool в true и этот код прекращает выполнятся (наставил везде флаги, если bool в true, то return), при нажатии кнопки старт меняется переменная bool в false и код в потоке начинает выполнятся сначала. Однако, если кнопка стоп была нажата в момент выполнения Thread.Sleep, то пока мы не дождемся его выполнения, кнопку старт нажимать нельзя, так как код просто не увидит что когда-то была нажата кнопка стоп и надо бы сбросить всё к чертям и начать все заново))
В общем вижу путь решения делать приостановку кода не Thread.Sleep, а таймером, но чет не хочется мне с ними замарачиваться, таймеров с десяток делать для каждого потока.. в общем это не выход.
Такое решение вроде норм?
//Thread.Sleep((Convert.ToInt16(textBox1.Text) * 1000)); //ждем пока трубка одумается int sleeps = 0; while (sleeps < Convert.ToInt16(textBox1.Text) * 1000) { Thread.Sleep(10); sleeps += 10; }
Решение задачи: «Прервать ожидание Thread.Sleep»
textual
Листинг программы
// Метод, выполняющийся в отдельном потоке static void DoStuff(object arg) { Console.WriteLine("Work started."); // Получение жетона из аргумента var cancellation = (CancellationToken)arg; // Дескриптор для ожидания отмены операции var cancellationHandle = cancellation.WaitHandle; // Таймаут на ожидание остановки работы var timeout = TimeSpan.FromSeconds(1); // Выполнять цикл, пока не будет получен сигнал на прекращение работы // Если сигнал на прекращение был подан в момент ожидания, то ожидание сразу прекратится while (!cancellationHandle.WaitOne(timeout)) Console.WriteLine("Do stuff"); Console.WriteLine("Work done."); } static void Main() { CancellationTokenSource workCancellation; do { // Этот объект является одноразовым: один раз отменив, потом надо создавать новый workCancellation = new CancellationTokenSource(); // Создание потока var thread = new Thread(DoStuff); // Запуск потока и передача ему жетона на прекращение работы thread.Start(workCancellation.Token); // Нажатие Enter останавливает поток Console.ReadLine(); // Подать сигнал на прекращение работы workCancellation.Cancel(); // Подождать поток, пока он не завершит работу thread.Join(); Console.WriteLine("Thread done"); Console.ReadLine(); } while (true); }
ИИ поможет Вам:
- решить любую задачу по программированию
- объяснить код
- расставить комментарии в коде
- и т.д