Здравствуйте, Аноним, Вы писали:
А>Поскольку вызовы асинхронные, то 3 строчка кода выполняется сразу, не дожидаясь пока foo и bar скачаются. Отсюда несложно догадаться о вопросе: как сделать, чтобы 3 строчка выполнялась после того, как фу и бар скачаются. Эксперименты с Task.WhenAll и тому подобным успеха не принесли.
Поскольку используется слово await, 3 строчка как раз и должна выполняться после того, как foo и bar скачаются. А если на практике это не так, это просто означает, что методы API.DownloadXXXAsync() неправильно написаны.
А>Поскольку вызовы асинхронные, то 3 строчка кода выполняется сразу, не дожидаясь пока foo и bar скачаются. Отсюда несложно догадаться о вопросе: как сделать, чтобы 3 строчка выполнялась после того, как фу и бар скачаются. Эксперименты с Task.WhenAll и тому подобным успеха не принесли.
Для того, что бы можно было ожидать в async методе, метод в котором он вызывается должен возвращать Task. Я подозреваю, что у вас он объявлен как void.
Примерно так должно быть:
public async Task LoadDataAsync()
{
Foo foo = await API.DownloadFooAsync();
Bar bar = await API.DownloadBarAsync();
textBlock.Text = "Загрузка завершена";
}
Best,
Aleksei
await/async
От:
Аноним
Дата:
24.01.14 16:05
Оценка:
Допустим, есть такой код:
Foo foo = await API.DownloadFooAsync();
Bar bar = await API.DownloadBarAsync();
textBlock.Text = "Загрузка завершена";
Поскольку вызовы асинхронные, то 3 строчка кода выполняется сразу, не дожидаясь пока foo и bar скачаются. Отсюда несложно догадаться о вопросе: как сделать, чтобы 3 строчка выполнялась после того, как фу и бар скачаются. Эксперименты с Task.WhenAll и тому подобным успеха не принесли.
Re[2]: await/async
От:
Аноним
Дата:
24.01.14 18:41
Оценка:
Здравствуйте, scale_tone, Вы писали:
_>Здравствуйте, Аноним, Вы писали:
А>>Поскольку вызовы асинхронные, то 3 строчка кода выполняется сразу, не дожидаясь пока foo и bar скачаются. Отсюда несложно догадаться о вопросе: как сделать, чтобы 3 строчка выполнялась после того, как фу и бар скачаются. Эксперименты с Task.WhenAll и тому подобным успеха не принесли.
_>Поскольку используется слово await, 3 строчка как раз и должна выполняться после того, как foo и bar скачаются. А если на практике это не так, это просто означает, что методы API.DownloadXXXAsync() неправильно написаны.
Ок, вот реализация "неправильной" функции:
public async Task<string> DownloadFooAsync()
{
WebClient wc = new WebClient();
return await wc.DownloadStringAsync(new Uri("blabla"));
}
В данном случае, 3 строчка выполняется несмотря на то, что данные все еще скачиваются.
N>>Скорее всего, тебе нужна функция WebClient.DownloadString<b>Task</b>Async.
N>Но я не понимаю, почему скомпилировалось выражение await wc.DownloadStringAsync(new Uri("blabla")). Я бы ожидал ошибку N>
А>В данном случае, 3 строчка выполняется несмотря на то, что данные все еще скачиваются.
Вызывающий код тогда должен выглядеть как string foo = await DownloadFooAsync(); по завершению этой строки в foo будет результат. Если данные при этом еще скачиваются — надо смотреть реализацию DownloadFooAsync скорее всего там что-то не так.
Если у Вас нет паранойи, то это еще не значит, что они за Вами не следят.
Здравствуйте, Аноним, Вы писали:
А>В моем коде именно эта функция и используется, после установки пакета Microsoft.Bcl.Async, чтобы можно было использовать async/await в WP8.
A>Для того, что бы можно было ожидать в async методе, метод в котором он вызывается должен возвращать Task. Я подозреваю, что у вас он объявлен как void.
Был бы void — получили бы
'SomeClass.AwaitMe()' does not return a Task and cannot be awaited. Consider changing it to return Task.