で非同期読み込みを開始してから、MVCアクションで完了することをお勧めします。Application_Start
await
これを簡単に行うにはTask<Dictionary<..>>
、を静的変数に保存してから、各非同期アクションを実行await
します。
// Or in a repository or whatever...
public static class SharedData
{
public static Task<Dictionary<int, string>> MyDictionary;
}
...
Application_Start(..)
{
// Start the dictionary filling, but don't wait for it to complete.
// Note that we're saving the Task, not await'ing it.
MyDictionary = MyLibrary.GetDictionary();
}
次に、それを必要とする各非同期アクションで:
public async Task<ActionResult> Get()
{
// Asynchronously wait for the dictionary to load if it hasn't already.
var dict = await SharedData.MyDictionary;
...
return View();
}
または、これに非同期レイジー初期化を使用することもできます。非同期レイジー初期化は、StephenToubによって最初に公開されました。コードを文書化し、ブログで.NET 4.5にアップグレードし、最近AsyncExライブラリに追加しました。
を使用するAsyncLazy<T>
と、コードは次のようになります。
// Or in a repository or whatever...
public static class SharedData
{
public static AsyncLazy<Dictionary<int, string>> MyDictionary =
new AsyncLazy<Dictionary<int, string>>(async () =>
{
var ret = new Dictionary<int, string>();
await MyLibrary.FillDictionary(ret);
return ret;
});
}
次に、それを必要とする各非同期アクションで:
public async Task<ActionResult> Get()
{
// Asynchronously wait for the dictionary to load if it hasn't already.
var dict = await SharedData.MyDictionary;
...
return View();
}
非同期レイジー初期化にはレイジーになる機能があるため、特定の辞書を必要とする最初のアクションでレイジーにawait
なります。使用されていない辞書がある場合、それらはロードされません。