1

チームの他のメンバーと私はSilverlightアプリケーションを作成しました。.NET4.0を使用しています。すでにasync/awaitパターンをアプリケーションに組み込んでいますが(Microsoft.CompilerServices.AsyncTargetingPack.Net4)。

MSがSilverlightにあまり多くの追加の労力を費やさないようになったので、問題を実験するためだけに、小さなHTML5/JSアプリケーションを作成することを考えました。

それで...前のSLアプリで行ったように、アプリケーションをブートストラップしようとしました。メインアプリケーションで使用されているクラスライブラリを使用して、すべてのデータを提供しています。コンテキスト内のすべてのディクショナリを埋めるために、いくつかの非同期メソッドを呼び出して、DBからデータを取得します。このlibをMVCアプリでも使用したいのですがApplication_Start、Global.asaxは非同期ではないため、これらの非同期メソッドを呼び出すことはできません。

これを達成する方法は?

ライブラリを変更することは、本番コードで使用されるため、実行可能なソリューションではありません。新しいlibを作成することも解決策にはなりません。これは、メンテナンスを可能な限り小さくしたいからです。

助言がありますか?

4

1 に答える 1

3

で非同期読み込みを開始してから、MVCアクションで完了することをお勧めします。Application_Startawait

これを簡単に行うには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なります。使用されていない辞書がある場合、それらはロードされません。

于 2012-10-16T18:50:26.417 に答える