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