异步/等待执行顺序

时间:2018-11-26 16:36:17

标签: c# xamarin.forms async-await

我试图在异步方法中获取数据,然后使用它。但是正如我所看到的,当数据仍然为空时,而不是等待数据准备就绪,而是尝试过早使用它。我该如何解决?谢谢。

// 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())

添加:

我试图在调用GetChannelData()之前使用await。我必须制作从异步调用的方法,所以这就是我现在所拥有的:

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

        return blah;
    }

...

            var blah = GetData();

我也有同样的问题。

2 个答案:

答案 0 :(得分:3)

您不是在等待异步方法完成。您应该将代码更改为:

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

您应该将方法的名称更改为GetChannelDataAsync(),以免日后忘记。

答案 1 :(得分:0)

您没有使用await调用该方法。因此,您的方法正在同步运行。一旦await httpClient.GetStringAsync(channelUrl)被调用,它将执行返回到您的调用线程,其中blah为空。

您必须使用以下语法:

var blah = await vm.GetChannelData();