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: await/async
От: scale_tone Норвегия https://scale-tone.github.io/
Дата: 24.01.14 16:23
Оценка: +2
Здравствуйте, Аноним, Вы писали:

А>Поскольку вызовы асинхронные, то 3 строчка кода выполняется сразу, не дожидаясь пока foo и bar скачаются. Отсюда несложно догадаться о вопросе: как сделать, чтобы 3 строчка выполнялась после того, как фу и бар скачаются. Эксперименты с Task.WhenAll и тому подобным успеха не принесли.


Поскольку используется слово await, 3 строчка как раз и должна выполняться после того, как foo и bar скачаются. А если на практике это не так, это просто означает, что методы API.DownloadXXXAsync() неправильно написаны.
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 строчка выполняется несмотря на то, что данные все еще скачиваются.
Re[3]: await/async
От: nikov США http://www.linkedin.com/in/nikov
Дата: 24.01.14 18:54
Оценка: +1
Здравствуйте, Аноним, Вы писали:

А>
А>public async Task<string> DownloadFooAsync()
А>{
А>    WebClient wc = new WebClient();

А>    return await wc.DownloadStringAsync(new Uri("blabla"));
А>}
А>


Скорее всего, тебе нужна функция WebClient.DownloadString<b>Task</b>Async.
Re[4]: await/async
От: nikov США http://www.linkedin.com/in/nikov
Дата: 24.01.14 18:59
Оценка:
Здравствуйте, nikov, Вы писали:

А>>
А>>public async Task<string> DownloadFooAsync()
А>>{
А>>    WebClient wc = new WebClient();

А>>    return await wc.DownloadStringAsync(new Uri("blabla"));
А>>}
А>>


N>Скорее всего, тебе нужна функция WebClient.DownloadString<b>Task</b>Async.


Но я не понимаю, почему скомпилировалось выражение await wc.DownloadStringAsync(new Uri("blabla")). Я бы ожидал ошибку
error CS4008: Cannot await 'void'
Re[4]: await/async
От: Аноним  
Дата: 24.01.14 19:36
Оценка:
Здравствуйте, nikov, Вы писали:

N>Здравствуйте, Аноним, Вы писали:


А>>
А>>public async Task<string> DownloadFooAsync()
А>>{
А>>    WebClient wc = new WebClient();

А>>    return await wc.DownloadStringAsync(new Uri("blabla"));
А>>}
А>>


N>Скорее всего, тебе нужна функция WebClient.DownloadString<b>Task</b>Async.


В моем коде именно эта функция и используется, после установки пакета Microsoft.Bcl.Async, чтобы можно было использовать async/await в WP8.
Re[5]: await/async
От: Аноним  
Дата: 24.01.14 19:58
Оценка:
Здравствуйте, nikov, Вы писали:

N>Здравствуйте, nikov, Вы писали:


А>>>
А>>>public async Task<string> DownloadFooAsync()
А>>>{
А>>>    WebClient wc = new WebClient();

А>>>    return await wc.DownloadStringAsync(new Uri("blabla"));
А>>>}
А>>>


N>>Скорее всего, тебе нужна функция WebClient.DownloadString<b>Task</b>Async.


N>Но я не понимаю, почему скомпилировалось выражение await wc.DownloadStringAsync(new Uri("blabla")). Я бы ожидал ошибку

N>
N>error CS4008: Cannot await 'void'
N>


Я очепятался Само собой, DownloadStringTaskAsync
Re[3]: await/async
От: TK Лес кывт.рф
Дата: 25.01.14 10:17
Оценка:
Здравствуйте, Аноним, Вы писали:

А>
А>public async Task<string> DownloadFooAsync()
А>{
А>    WebClient wc = new WebClient();

А>    return await wc.DownloadStringAsync(new Uri("blabla"));
А>}
А>


А>В данном случае, 3 строчка выполняется несмотря на то, что данные все еще скачиваются.


Вызывающий код тогда должен выглядеть как string foo = await DownloadFooAsync(); по завершению этой строки в foo будет результат. Если данные при этом еще скачиваются — надо смотреть реализацию DownloadFooAsync скорее всего там что-то не так.
Если у Вас нет паранойи, то это еще не значит, что они за Вами не следят.
Re[5]: await/async
От: SomeOne_TT  
Дата: 25.01.14 11:49
Оценка:
Здравствуйте, Аноним, Вы писали:

А>В моем коде именно эта функция и используется, после установки пакета Microsoft.Bcl.Async, чтобы можно было использовать async/await в WP8.


В WP8 async/await доступны "из коробки"
Re: await/async
От: Astral29 Эстония  
Дата: 28.01.14 08:40
Оценка: -1
Здравствуйте, Аноним, Вы писали:

А>Допустим, есть такой код:


А>
А>Foo foo = await API.DownloadFooAsync();
А>Bar bar = await API.DownloadBarAsync();
А>textBlock.Text = "Загрузка завершена";
А>


А>Поскольку вызовы асинхронные, то 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
Re[2]: await/async
От: Sinix  
Дата: 28.01.14 09:07
Оценка:
Здравствуйте, Astral29, Вы писали:


A>Для того, что бы можно было ожидать в async методе, метод в котором он вызывается должен возвращать Task. Я подозреваю, что у вас он объявлен как void.


Был бы void — получили бы
'SomeClass.AwaitMe()' does not return a Task and cannot be awaited. Consider changing it to return Task.
Re[2]: await/async
От: Sinix  
Дата: 28.01.14 09:09
Оценка:
P.S. Если имеется виду Task в самом методе —
        private async void AwaitMe()
        {
            Stopwatch sw = Stopwatch.StartNew();
            await Task.Delay(1000);

            Title = sw.Elapsed.ToString();
        }

Проверяйте
Re[3]: await/async
От: Astral29 Эстония  
Дата: 28.01.14 19:12
Оценка:
Здравствуйте, Sinix, Вы писали:

S>Был бы void — получили бы

S>
S>'SomeClass.AwaitMe()' does not return a Task and cannot be awaited. Consider changing it to return Task.
S>


Я имел ввиду конечно же async void.
Re[4]: await/async
От: Sinix  
Дата: 29.01.14 05:05
Оценка:
Здравствуйте, Astral29, Вы писали:

A>Я имел ввиду конечно же async void.

Я тоже. Проверьте на
        var t = await AwaitMe();

        private async void AwaitMe()
        {
            Stopwatch sw = Stopwatch.StartNew();
            await Task.Delay(1000);

            Title = sw.Elapsed.ToString();
        }
 
Подождите ...
Wait...
Пока на собственное сообщение не было ответов, его можно удалить.