Отмена темы сна - PullRequest
       8

Отмена темы сна

1 голос
/ 07 февраля 2020

У меня есть простое консольное приложение с 2 работающими потоками.

Первый поток измеряет некоторые значения, а второй ищет пользовательский ввод и выполняет некоторые движения мыши.

while (true)
{
    if (Input.IsKeyDown(VC_L))
    {
        Mouse.Move(300, 500);
        Thread.Sleep(thread1_delay);
        Mouse.Move(670, 300);
        Thread.Sleep(thread1_delay);
        Mouse.Move(870, 700);
        Thread.Sleep(thread1_delay);
    }
}

Проблема в том, что я хочу остановить второй поток, как только я получу другой ключ в качестве ввода. Но это не работает, так как поток все еще спит и не реагирует.

Ответы [ 2 ]

0 голосов
/ 07 февраля 2020

Просто используйте CancellationToken и покончите с этим

Распространяет уведомление об отмене операций.

Пример

public static async Task DoFunkyStuff(CancellationToken token)
{
   // a logical escape for the loop
   while (!token.IsCancellationRequested)
   {
      try
      {
         Console.WriteLine("Waiting");
         await Task.Delay(1000, token);
      }
      catch (OperationCanceledException e)
      {
         Console.WriteLine("Task Cancelled");
      }
   }
   Console.WriteLine("Finished");
}

Использование

static async Task Main(string[] args)
{

   var ts = new CancellationTokenSource();

   Console.WriteLine("Press key to cancel tasks");
   var task = DoFunkyStuff(ts.Token);

   // user input
   Console.ReadKey();

   Console.WriteLine("Cancelling token");

   // this is how to cancel
   ts.Cancel();

   // just to prove the task has been cancelled
   await task;

   // because i can
   Console.WriteLine("Elvis has left the building");
   Console.ReadKey();
}

Результаты

Press key to cancel tasks
Waiting
Waiting
Waiting
Waiting
Waiting
Cancelling token
Task Cancelled
Finished
Elvis has left the building
0 голосов
/ 07 февраля 2020

Второй поток должен проверять логическое значение, когда он просыпается. Вы должны установить это значение в ложь, когда ваше условие выполнено. Теперь, когда второй поток проснется, он завершит свое выполнение.

...