Прервать ожидание 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);
- }
ИИ поможет Вам:
- решить любую задачу по программированию
- объяснить код
- расставить комментарии в коде
- и т.д