我试图在异步方法中获取数据,然后使用它。但是正如我所看到的,当数据仍然为空时,而不是等待数据准备就绪,而是尝试过早使用它。我该如何解决?谢谢。
// 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();
我也有同样的问题。
答案 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();