“的await”不等待调用完成(“await” doesn't wait for the c

2019-07-31 07:47发布

我建立一个Metro应用。

在MainPage.xaml.cs,我实例专辑如下:

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.
}

最后,初始化方法:

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,它然后去ListView1.ItemsSource = album.Songs直接与album.Songs空。

有没有快速的解决这个问题? THX提前。

Answer 1:

是。 整点asyncawait是你阻止。 相反,如果你是“等待”,它尚未完成的操作,继续按计划执行异步方法的其余部分,并控制返回给调用者。

现在,因为你的方法有一个类型的void ,你不知道当这样就算完了的方式-如果你返回Task (这不会需要在方法体中的任何改变),你会至少能够制定出当它已经完成。

这不是真的清楚你的代码是什么样子,但是从根本上,你应该只尝试设置ItemsSource初始化完成 。 你应该有你MainPage在异步方法也一样,它看起来是这样的代码:

Album album = new Album(2012);
ListView1.ItemsSource = await album.GetSongsAsync();

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);
}

这意味着, Songs将不再是一个财产Album本身,尽管你可以将它添加了缓存的目的,如果你想。



Answer 2:

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



文章来源: “await” doesn't wait for the completion of call