Прервать ожидание 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);
}

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


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

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

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