асинхронный / ожидание порядка исполнения - PullRequest
0 голосов
/ 26 ноября 2018

Я пытаюсь получить данные в асинхронном методе, а затем использовать его.Но, как я вижу, вместо того, чтобы ждать подготовки данных, делается попытка использовать их слишком рано, когда данные еще пусты.Как я могу это исправить?Спасибо.

// In YouTubeViewModel class
    async public Task<List<YouTubeItem>> GetChannelData()
    {
        try
        {
            using (var httpClient = new HttpClient())
            {
                var videoIds = new List<string>();
                var json = await httpClient.GetStringAsync(channelUrl);

                // Deserialize our data, this is in a simple List format
                var response = JsonConvert.DeserializeObject<YouTubeApiListRoot>(json);

                // Add all the video id's we've found to our list.
                videoIds.AddRange(response.items.Select(item => item.id.videoId));

                // Get the details for all our items
                Items = await GetVideoDetailsAsync(videoIds);
            }
        }
        catch (Exception ex)
        {
            var ms = ex;
        }

        return Items;
    }

...

        YouTubeViewModel vm = new YouTubeViewModel();
        var blah = vm.GetChannelData(); // Items collection returned is empty, as it is called right after executing using (var httpClient = new HttpClient())

Добавлено:

Я пытался использовать await перед вызовом GetChannelData ().Мне пришлось сделать метод, который он вызывается из асинхронного, так что это то, что у меня сейчас:

    async Task<List<YouTubeItem>> GetData()
    {
        YouTubeViewModel vm = new YouTubeViewModel();
        var blah = await vm.GetChannelData();

        return blah;
    }

...

            var blah = GetData();

И у меня та же проблема.

Ответы [ 2 ]

0 голосов
/ 26 ноября 2018

Вы не вызываете метод с await.Поэтому ваш метод работает синхронно.Как только await httpClient.GetStringAsync(channelUrl) вызывается, он возвращает выполнение в ваш вызывающий поток, где blah пусто.

Вы должны использовать этот синтаксис:

var blah = await vm.GetChannelData();

0 голосов
/ 26 ноября 2018

Вы не ожидаете завершения асинхронного метода.Вы должны изменить свой код на:

YouTubeViewModel vm = new YouTubeViewModel();
var blah = await vm.GetChannelData(); 

Вы должны изменить имя метода на GetChannelDataAsync(), чтобы не забыть об этом в будущем.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...