Здравствуйте. Учу C# и столкнулся с проблемой. Код такой:
static void Main() {
Task<string> fooTask = foo();
Task<string> barTask = bar();
Task.WhenAll(new[] { fooTask, barTask});
Console.WriteLine(fooTask.Result);
Console.WriteLine(barTask.Result);
Console.ReadLine();
}
static Task<string> foo() {
return Task.Run(() => {
Console.WriteLine("Начал foo()");
Thread.Sleep(1000);
Console.WriteLine("Закончил foo()");
return "foo";
});
}
static Task<string> bar() {
return Task.Run(() => {
Console.WriteLine("Начал bar()");
Thread.Sleep(2000);
Console.WriteLine("Закончил bar()");
return "bar";
});
}
Результат такой:
Начал foo()
Начал bar()
Начал fooBar()
Закончил foo()
foo
Закончил bar()
bar
Мне понятно, почему этот код работает асинхронно, но не очень понятно, почему foo выводится после foo(), а bar - после bar(). Ведь Task.WhenAll() работает асинхронно, и код после него должен выполняться сразу же, не дожидаясь выполнения Task.WhenAll(), но программа каким-то образом выводит fooTask.Result сразу же после выполнения fooTask(). Почему?