Это ожидаемое поведение.

у начать коллекциюTask объекты в то же время и ждать, пока все не будет завершено. Следующий код показывает мое желаемое поведение.

public class Program
{
    class TaskTest
    {
        private Task createPauseTask(int ms)
        {
            // works well
            return Task.Run(async () =>
            // subsitution: return new Task(async () =>
            {
                Console.WriteLine($"Start {ms} ms pause");
                await Task.Delay(ms);
                Console.WriteLine($"{ms} ms are elapsed");
            });
        }

        public async Task Start()
        {
            var taskList= new List<Task>(new[]
            {
                createPauseTask(1000),
                createPauseTask(2000)
            });
            // taskList.ForEach(x => x.Start());
            await Task.WhenAll(taskList);
            Console.WriteLine("------------");
        }
    }

    public static void Main()
    {
        var t = new TaskTest();
        Task.Run(() => t.Start());
        Console.ReadKey();
    }
}

Выход:

Start 1000 ms pause
Start 2000 ms pause
1000 ms are elapsed
2000 ms are elapsed
------------

Теперь мне интересно, можно ли подготовить мои задания и запустить их отдельно. Для этого я изменяю первую строку вcreatePauseTask(int ms)метод изreturn Task.Run(async () => вreturn new Task(async () =>

и вStart() метод, который я включилtaskList.ForEach(x => x.Start()); передWhenAll, Но тогда происходят ужасные вещи.WhenAll вызов завершается немедленно, и вывод:

Start 2000 ms pause
Start 1000 ms pause    
------------    
1000 ms are elapsed
2000 ms are elapsed

Может кто-нибудь показать мне, в чем моя ошибка и как ее исправить?

Ответы на вопрос(2)

Ваш ответ на вопрос