Класс задачи - это асинхронная оболочка задачи. 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 представляет состояние потока в машине состояния. Каждое состояние в конечной машине имеет несколько состояний, таких как «Пуск», «Задержка», «Отмена» и «Стоп».
Теперь вы можете задаться вопросом, является ли вся 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");
}
Теперь, когда программа запущена, вы можете ввести «стоп», чтобы отменить задачу «Задержка».