“await”不等待电话完成
我正在构建一个Metro App。
在MainPage.xaml.cs中,我实例化Album,如下所示:
Album album = new Album(2012); //With the album ID as its parameter. ListView1.ItemsSource = album.Songs;
在Album.cs中,构造函数如下:
public Album(int ID) { this.ID = ID; Initialize(); //Serves as a wrapper because I have to call httpClient.GetStreamAsync() and "async" doesn't work for the constructor. }
最后,Initialize方法:
private async void Initialize() { //...some code... HttpClient cli = new HttpClient(); Stream SourceStream = await HttpClient.GetStreamAsync("http://contoso.com"); //...some code... this.Songs = Parse(SourceStream); }
问题是当它运行到GetStreamAsync时,然后直接使用album.Songs null转到ListView1.ItemsSource = album.Songs
。
有这个问题的快速解决方案吗? Thx提前。
是。 async
和await
是你不会阻止。 相反,如果您正在“等待”尚未完成的操作,则会计划继续执行其余的异步方法,并将控制权返回给调用方。
现在因为你的方法有一种void
,你无法知道什么时候甚至完成 – 如果你返回Task
(不需要对方法体进行任何改变)你至少可以解决什么时候结束了。
你的代码看起来并不是很清楚,但从根本上说,你应该只是在初始化完成后尝试设置ItemsSource
。 您可能也应该在异步方法中使用您的MainPage
代码,这看起来像:
Album album = new Album(2012); ListView1.ItemsSource = await album.GetSongsAsync();
您的GetSongs()
调用将是:
private async Task> GetSongsAsync() { //...some code... HttpClient cli = new HttpClient(); Stream SourceStream = await HttpClient.GetStreamAsync("http://contoso.com"); //...some code... return Parse(SourceStream); }
这意味着Songs
将不再是Album
本身的属性,但如果您愿意,可以将其添加到缓存目的。
Make Songs
属性返回Task
并等待>
ListView1.ItemsSource = await album.Songs;