4

次のように定義された権限のリストがあります。

private List<PermissionItem> permissionItems;
private ReadOnlyCollection<PermissionItem> permissionItemsReadOnly;

このリストは、バックグラウンド スレッドを介して Web サービスから取得されます。読み取り専用バージョンは、リスト バージョンから入力されます。

このリストを、次のように (かなり大きな) アプリケーションの残りの部分に公開します。

public IQueryable<PermissionItem> PermissionItems
{
   get
   {
       // Make sure that the permissions have returned.  
       // If they have not then we need to wait for that to happen.
       if (!doneLoadingPermissions.WaitOne(10000))
           throw new ApplicationException("Could not load permissions");

       return permissionItemsReadOnly.AsQueryable();
   }
}

これはすべて順調です。ユーザーはアクセス許可を要求し、ロード後にアクセス許可を取得できます。

しかし、コンストラクター (別のクラス) に次のようなコードがある場合:

ThisClassInstanceOfThePermisssions = SecurityStuff.PermissionItems;

次に、アクセス許可が返されるまでブロックされると確信しています。ただし、権限が実際に使用されるまでブロックする必要はありません。

IQueryable は「遅延読み込み」であることを読みました。(私は Entity Framework コードでこの機能を使用しました。)

これを変更して、いつでも IQueryable への参照を許可し、データが実際に使用されている場合にのみブロックする方法はありますか?

注: これは「あると便利な」機能です。実際にアクセス許可をロードするのにそれほど時間はかかりません。したがって、これが「独自の」クエリ/式のものである場合は、おそらく合格します。しかし、私はそれを機能させるために何が必要かについて興味があります。

4

2 に答える 2

1

Lazy<T>クラスを見てみましょう。

遅延初期化は、 Lazy.Valueプロパティに初めてアクセスしたときに発生します。Lazy のインスタンスを使用して、大規模なオブジェクトやリソースを集中的に使用するオブジェクトの作成、またはリソースを集中的に使用するタスクの実行を延期します

于 2012-08-08T21:10:08.343 に答える