kykyryky
@kykyryky

Почему await не ждет выполнения предыдущего await?

Есть 3 метода:
1. Чтение из файла:
public Task LoadFromFileAsync()
        {
            return Task.Run(() =>
            {
                //загрузка данных из файла
            });
        }

2. Расчеты. одновременно запускает 3 метода разного рода расчетов:
public async Task StartCalculationAsync()
        {
            Task.Factory.StartNew(() => Calculation1());
            Task.Factory.StartNew(() => Calculation2());
            Task.Factory.StartNew(() => Calculation3());
        }

3. Сохранение результатов:
public Task SaveToFileAsync()
        {
            return Task.Run(() =>
            {
                SaveToFile();
            });
        }


В обработчике событий вызываются следующим образом:
private async void button_Click(object sender, RoutedEventArgs e)
        {
            await LoadFromFileAsync(); //выполняется 10-15 секунд
            await StartCalculationAsync(); //может выполняться часами
            await SaveToFileAsync(); //выполняется 1-2 секунды
        }

LoadFromFileAsync выполняется, StartCalculationAsync ждет завершения работы LoadFromFileAsync и после этого начинает выполняться. Но одновременно с ним начинает выполняться SaveToFileAsync. Почему так происходит? Ведь SaveToFileAsync должен дождаться выполнения StartCalculationAsync.

И почему модер удалил тег "Программирование". Это что, не программирование?
  • Вопрос задан
  • 597 просмотров
Решения вопроса 2
petermzg
@petermzg
Самый лучший программист
Тут
public async Task StartCalculationAsync()
{
            Task.Factory.StartNew(() => Calculation1());
            Task.Factory.StartNew(() => Calculation2());
            Task.Factory.StartNew(() => Calculation3());
}

вы стартанули 3 потока, но вот созданные обьекты Task вы не возвращаете. Что программа ждать должна?
Task.WaitAll вам в помощь
Ответ написан
Используйте метод .WhenAll() и будет вам счастье https://msdn.microsoft.com/en-us/library/hh160384(...
Ответ написан
Комментировать
Пригласить эксперта
Ваш ответ на вопрос

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

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