0

async とマークされたメソッド内でのみawaitキーワードを使用できるという事実を考えると、コンストラクターからファイルベースのデータ モデルを初期化する方法は何ですか? OnNavigatedTo() メソッドで DataContext を設定する予定です。

以前、私は簡単に言ったでしょう

MyDataModel d = 新しい MyDataModel();

MyDataModel のコンストラクターがファイル I/O を実行します。

これまでのところ、コンストラクターで DispatchTimer を使用して、非同期とマークされたイベント ハンドラーを起動し、そこからファイル I/O を実行できることだけがわかりました。

4

3 に答える 3

0

DataModel を Navigate メソッドのパラメーターとして渡し、e.Parameter から OnNavigatedTo(NavigationEventArgs e) にキャストすることができます。

-また-

IOC コンテナーを試すことができます。私はNinjectを使用しましたが、Metro アプリで動作するかどうかはまだわかりません。 MVVM Lightには、シンプルな IOC コンテナーもあります。

于 2012-05-31T18:32:15.727 に答える
0

私が発見した要点は、オブジェクトコンストラクターで「見かけの同期」動作を使用してファイル I/O を実行することは基本的に不可能であるということです。

したがって、私の Win8 アプリでは、最初のページに移動する前にデータ モデルをインスタンス化するか (ファイル I/O が含まれる場合はあまり良い考えではありません)、単純に「ルーシー グーシー」なビジュアル エクスペリエンスをそのまま使用するかの選択肢がありました。最初のページが表示され、データが読み込まれ、DataContext が実際のデータ モデルで更新された後、準備ができたときにデータが「飛び込み」ます。

アプリが 5 秒未満で起動することになっていることを考慮して (可能であれば、それよりはるかに短い)、「ルーシー グーシー」アプローチを選択しました。

于 2012-06-04T19:45:44.557 に答える
0

あなたの質問を正しく理解していれば(マイケルの回答に対するあなたのコメントに基づいて)。awaitコンストラクターで非同期操作を行うのに苦労しています。コンストラクターを非同期にすることはできないため、そこで非同期メソッドを待機することはできません。ただし、簡単な回避策があります。コンストラクターですべての非同期操作をリファクタリングし、それらを非同期メソッドに追加できますが、それを待つ必要はありません。LoadFileAsync以下の例では、コンストラクターから呼び出すことができます。

class MyDataModel
{
  public MyDataModel()
  {
      LoadFileAsync(); 
  }
  public async void LoadFileAsync()
  {
     // do async operations here 
     var file = await FooAsync(); 
  }
}

これを行うと、最終的にページのコンストラクターから、またはからデータモデルを設定できるようになりますonNavigateTo

于 2012-06-01T00:10:23.770 に答える