Когда начинается С# Task?

Когда действительно запускается Task?

public void DoSomething() {
    Task myTask = DoSomethingAsync();

    Task.WaitAll(new[] { myTask }, 2000);
}

public async Task DoSomethingAsync() {
    await SomethingElse();
}

Не запускается ли он сразу при инициализации в Task myTask = DoSomethingAsync(); или запускается, когда вы говорите, чтобы ждать его в Task.WaitAll(new[] { myTask }, 2000);?

Ответ 1

Вызов метода async возвращает горячую задачу, задачу, которая уже была запущена. Таким образом, нет фактического кода, необходимого для его запуска.

Согласно MSDN (благодаря Стивену Клири) шаблон асинхронного шаблона (TAP) на основе задач требует, чтобы возвращаемые задачи были горячими. Это означает, что все задачи, кроме тех, которые созданы с помощью new Task, будут горячими.

Из ссылочной статьи:

Задачи, созданные публичными конструкторами Task, называются холодными задачами... Все остальные задачи начинают свой жизненный цикл в горячем состоянии.