Split Page サンプル アプリに基づいて Windows 8 Metro アプリを作成しました。ただし、サンプル アプリでは、データはコンストラクターで同期的に読み込まれます。テキスト ファイルにアクセスしているため、データを非同期的にロードする必要があります。コンストラクタは次のようになります。
public MyDataSource()
{
DataLoaded = false;
LoadData();
}
LoadData()
データモデルを設定する非同期メソッドです。これは正常に機能し、データをそのまま表示します (これは私が望む動作です)。サスペンドと終了をテストしようとすると、問題が発生します。問題は、データが取り込まれる前にリカバリがデータ モデルにアクセスしようとする可能性があることです。
public static MyDataGroup GetGroup(string uniqueId)
{
// If the data hasn't been loaded yet then what?
if (_myDataSource == null)
{
// Where app has been suspended and terminated there is no data available yet
}
// Simple linear search is acceptable for small data sets
var matches = _myDataSource.AllGroups.Where((group) => group.UniqueId.Equals(uniqueId));
if (matches.Count() == 1) return matches.First();
return null;
}
コンストラクターを call に変更することでこれを修正できますLoadData().Wait
が、これはアプリが UI スレッドをロックすることを意味します。私が必要としているのはGetGroup
、UI スレッドをロックせずにデータがロードされるまで回復コードを取得する方法です。これは可能ですか、または推奨されますか? もしそうなら、どのように?
編集:
のタスクをキャッシュすることを提案した人が 1 人か 2 人いますLoadData()
。これは素晴らしいアイデアですが、内部のコードGetGroup
はページ状態管理セクションによって呼び出されるため、非同期にすることはできません。これを回避するために、次のことを試しました。
if (!DataLoaded)
{
//dataLoading = await MyDataSource.LoadData();
dataLoading.RunSynchronously();
}
しかし、これは私にエラーを与えます:
RunSynchronously may not be called on a task not bound to a delegate, such as the task returned from an asynchronous method.
と
dataLoading.Wait()
UIをロックするだけです。