"等待"不等待电话完成

Isi*_* O. 24 c# asynchronous .net-4.5

我正在构建一个Metro App.

在MainPage.xaml.cs中,我实例化Album,如下所示:

Album album = new Album(2012);  //With the album ID as its parameter.
ListView1.ItemsSource = album.Songs;
Run Code Online (Sandbox Code Playgroud)

在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.
}
Run Code Online (Sandbox Code Playgroud)

最后,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);
}
Run Code Online (Sandbox Code Playgroud)

问题是当它运行到GetStreamAsync时,它会ListView1.ItemsSource = album.Songs直接转到album.Songs null.

有这个问题的快速解决方案吗?Thx提前.

Jon*_*eet 35

是.整点asyncawait是你阻止.相反,如果您正在"等待"尚未完成的操作,则会计划继续执行其余的异步方法,并将控制权返回给调用方.

现在因为你的方法有一种类型void,你无法知道什么时候甚至完成 - 如果你返回Task(这不需要对方法体进行任何改变)你至少可以在它完成时解决已经结束.

这不是真的清楚你的代码是什么样子,但是从根本上,你应该只尝试设置ItemsSource 后,初始化完成.您可能也应该MainPage在异步方法中使用代码,这看起来像:

Album album = new Album(2012);
ListView1.ItemsSource = await album.GetSongsAsync();
Run Code Online (Sandbox Code Playgroud)

您的GetSongs()电话将是:

private async Task<List<Song>> GetSongsAsync()
{
    //...some code...
    HttpClient cli = new HttpClient();
    Stream SourceStream = await HttpClient.GetStreamAsync("http://contoso.com");
    //...some code...
    return Parse(SourceStream);
}
Run Code Online (Sandbox Code Playgroud)

这意味着Songs它将不再是Album自身的属性,但如果您愿意,可以将其添加到缓存目的中.


L.B*_*L.B 5

Songs返还财产Task<List<Song>>,并在等待ListView1.ItemsSource = await album.Songs;