mak_ufo
@mak_ufo

Почему асинхронный код себя так ведёт?

Здравствуйте. Учу 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(). Почему?
  • Вопрос задан
  • 173 просмотра
Пригласить эксперта
Ответы на вопрос 2
Что бы узнать этот самый Result необходимо завершения таска, вот оно и ждет...
Ответ написан
Комментировать
dasha_programmist
@dasha_programmist
ex Software Engineer at Reddit TS/React/GraphQL/Go
Дело в том, что метод WhenAll сам по себе возвращает Task, который тоже нужно дождаться (await Task.WhenAll() или Task.WhenAll().Result).

В данном случае уместно вызывать метод Task.WaitAll
Ответ написан
Комментировать
Ваш ответ на вопрос

Войдите, чтобы написать ответ

Похожие вопросы