Якорь или кнопка

Понять задачу C #, async и ждать

Задача C #

Класс задачи - это асинхронная оболочка задачи. Thread.Sleep (1000) может остановить поток, выполняющийся в течение 1 секунды. Хотя Task.Delay (1000) не остановит текущую работу. См. Код:

public static void Main(string[] args){
    TaskTest();
}
private static void TaskTest(){
     Task.Delay(5000);
     System.Console.WriteLine("task done");
}

При запуске сразу будет отображаться «задача выполнена». Поэтому я могу предположить, что каждый метод из Task должен быть асинхронным. Если я заменю TaskTest () на Task.Run (() => TaskTest ()) выполненная задача не будет отображаться вообще, пока я не добавлю консоль. ReadLine (); после метода Run.

Внутренне класс Task представляет состояние потока в машине состояния. Каждое состояние в конечной машине имеет несколько состояний, таких как «Пуск», «Задержка», «Отмена» и «Стоп».

async и жду

Теперь вы можете задаться вопросом, является ли вся Task асинхронной, цель Task.Delay? next, давайте действительно задерживаем текущий поток, используя async и ожидаем

public static void Main(string[] args){
     TaskTest();
     System.Console.WriteLine("main thread is not blocked");
     Console.ReadLine();
}
private static async void TaskTest(){
     await Task.Delay(5000);
     System.Console.WriteLine("task done");
}

async tell caller, я асинхронный метод, не ждите меня. ожидание внутри TaskTest () требует ожидания асинхронной задачи. Теперь, после запуска, программа будет ждать 5 секунд, чтобы показать текст, выполненный по заданию.

Отменить задачу

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

static CancellationTokenSource tokenSource = new CancellationTokenSource();
public static void Main(string[] args){
    TaskTest();
    System.Console.WriteLine("main thread is not blocked");
    var input=Console.ReadLine();
    if(input=="stop"){
          tokenSource.Cancel();
          System.Console.WriteLine("task stopped");
     }
     Console.ReadLine();
}
private static async void TaskTest(){
     try{
          await Task.Delay(5000,tokenSource.Token);
     }catch(TaskCanceledException e){
          //cancel task will throw out a exception, just catch it, do nothing.
     }
     System.Console.WriteLine("task done");
}

Теперь, когда программа запущена, вы можете ввести «стоп», чтобы отменить задачу «Задержка».

7
задан Fred 19 August 2013 в 12:39
поделиться