28

私はメトロアプリを構築しています。

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 を実行するときにListView1.ItemsSource = album.Songs、album.Songs null を直接使用することです。

この問題の迅速な解決策はありますか?

4

2 に答える 2

41

はい。との要点はasync、ブロックしないawaitことです。代わりに、まだ完了していない操作を「待機」している場合は、非同期メソッドの残りを実行するために継続がスケジュールされ、制御が呼び出し元に返されます。

メソッドが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

于 2012-09-02T12:35:27.477 に答える
5

プロパティをSongs返しTask<List<Song>>て、で待ちますListView1.ItemsSource = await album.Songs;

于 2012-09-02T12:34:25.127 に答える