コンストラクターで非同期メソッドを呼び出しますか? 質問する

コンストラクターで非同期メソッドを呼び出しますか? 質問する

概要: コンストラクターで非同期メソッドを呼び出したいのですが、これは可能ですか?

詳細: JSON データを解析する というメソッドがあります。メソッドを呼び出してその左側に配置するgetwritings()だけで、すべて正常に動作します。ただし、ページに を作成して設定しようとすると、意外にも が返され、 が空であることがわかります。getwritings()asyncawaitLongListViewgetWritings()nullLongListView

この問題を解決するために、 の戻り値の型をgetWritings()に変更しTask<List<Writing>>、 を介してコンストラクターで結果を取得しようとしました。ただし、これを行うとUI スレッドがブロックgetWritings().Resultされてしまいます。

public partial class Page2 : PhoneApplicationPage
{
    List<Writing> writings;

    public Page2()
    {
        InitializeComponent();
        getWritings();
    }

    private async void getWritings()
    {
        string jsonData = await JsonDataManager.GetJsonAsync("1");
        JObject obj = JObject.Parse(jsonData);
        JArray array = (JArray)obj["posts"];

        for (int i = 0; i < array.Count; i++)
        {
            Writing writing = new Writing();
            writing.content = JsonDataManager.JsonParse(array, i, "content");
            writing.date = JsonDataManager.JsonParse(array, i, "date");
            writing.image = JsonDataManager.JsonParse(array, i, "url");
            writing.summary = JsonDataManager.JsonParse(array, i, "excerpt");
            writing.title = JsonDataManager.JsonParse(array, i, "title");

            writings.Add(writing);
        }

        myLongList.ItemsSource = writings;
    }
}

ベストアンサー1

最善の解決策は、ダウンロードの非同期性を認識し、それを考慮して設計することです。

つまり、データのダウンロード中にアプリケーションがどのように見えるかを決定します。ページ コンストラクターでそのビューを設定し、ダウンロードを開始します。ダウンロードが完了したら、ページを更新してデータを表示します。

ブログ記事を書いています非同期コンストラクタ役に立つと思われるMSDNの記事もいくつかあります。非同期データバインディング(MVVMを使用している場合)そしてもう一つは非同期のベストプラクティス(つまり、 を避けるべきですasync void)。

おすすめ記事