Прервать ожидание Thread.Sleep - C#

Узнай цену своей работы

Формулировка задачи:

Можно ли прервать ожидание Thread.Sleep? У меня сейчас в отдельном потоке выполняется некий код, при нажатии кнопки стоп меняется переменная bool в true и этот код прекращает выполнятся (наставил везде флаги, если bool в true, то return), при нажатии кнопки старт меняется переменная bool в false и код в потоке начинает выполнятся сначала. Однако, если кнопка стоп была нажата в момент выполнения Thread.Sleep, то пока мы не дождемся его выполнения, кнопку старт нажимать нельзя, так как код просто не увидит что когда-то была нажата кнопка стоп и надо бы сбросить всё к чертям и начать все заново)) В общем вижу путь решения делать приостановку кода не Thread.Sleep, а таймером, но чет не хочется мне с ними замарачиваться, таймеров с десяток делать для каждого потока.. в общем это не выход.
Такое решение вроде норм?
Листинг программы
  1. //Thread.Sleep((Convert.ToInt16(textBox1.Text) * 1000)); //ждем пока трубка одумается
  2. int sleeps = 0;
  3. while (sleeps < Convert.ToInt16(textBox1.Text) * 1000)
  4. {
  5. Thread.Sleep(10);
  6. sleeps += 10;
  7. }

Решение задачи: «Прервать ожидание Thread.Sleep»

textual
Листинг программы
  1. // Метод, выполняющийся в отдельном потоке
  2. static void DoStuff(object arg)
  3. {
  4.     Console.WriteLine("Work started.");
  5.  
  6.     // Получение жетона из аргумента
  7.     var cancellation = (CancellationToken)arg;
  8.  
  9.     // Дескриптор для ожидания отмены операции
  10.     var cancellationHandle = cancellation.WaitHandle;
  11.  
  12.     // Таймаут на ожидание остановки работы
  13.     var timeout = TimeSpan.FromSeconds(1);
  14.  
  15.     // Выполнять цикл, пока не будет получен сигнал на прекращение работы
  16.     // Если сигнал на прекращение был подан в момент ожидания, то ожидание сразу прекратится
  17.     while (!cancellationHandle.WaitOne(timeout))
  18.         Console.WriteLine("Do stuff");
  19.  
  20.     Console.WriteLine("Work done.");
  21. }
  22. static void Main()
  23. {
  24.     CancellationTokenSource workCancellation;
  25.  
  26.     do
  27.     {
  28.         // Этот объект является одноразовым: один раз отменив, потом надо создавать новый
  29.         workCancellation = new CancellationTokenSource();
  30.  
  31.         // Создание потока
  32.         var thread = new Thread(DoStuff);
  33.  
  34.         // Запуск потока и передача ему жетона на прекращение работы
  35.         thread.Start(workCancellation.Token);
  36.  
  37.         // Нажатие Enter останавливает поток
  38.         Console.ReadLine();
  39.  
  40.         // Подать сигнал на прекращение работы
  41.         workCancellation.Cancel();
  42.  
  43.         // Подождать поток, пока он не завершит работу
  44.         thread.Join();
  45.  
  46.         Console.WriteLine("Thread done");
  47.         Console.ReadLine();
  48.     }
  49.     while (true);
  50. }

ИИ поможет Вам:


  • решить любую задачу по программированию
  • объяснить код
  • расставить комментарии в коде
  • и т.д
Попробуйте бесплатно

Оцени полезность:

12   голосов , оценка 3.583 из 5

Нужна аналогичная работа?

Оформи быстрый заказ и узнай стоимость

Бесплатно
Оформите заказ и авторы начнут откликаться уже через 10 минут