2010-12-02 6 views
0

私はasp.net mvcを使用してWebアプリケーションを開発しています。リストに<T>キャッシュ(セキュリティ操作)

私はキャッシュ内のリスト(私のモデルの製品クラスのリスト)を持っています。だから、私はこのキャッシュリストでCRUD操作を行います。私は、HttpContext.Current.CacheはtypeSafeだが、リストはないことを知っている。私は、競合を避けるためにスレッドセーフであるために私の操作を行うための最良の方法は何かを知りたいですか?

私のコードのようなものです:私はことを私は知っている...私は同時に、このキャッシュされたリストに書いて多くのユーザーを持つことになります

public static class ProjectCached { 
    const string key = "ProductList"; 
    // my cached list 
    public static IList<Product> Products { 
     get { 
      if (HttpContext.Current.Cache[key] == null) { 
       HttpContext.Current.Cache.Insert(key, /* get data from database */, ...); 
      } 
      return (List<Product>)HttpContext.Current.Cache[key]; 
     } 
    } 
    // my methods (operations on cached list) 
    public static void Increase(long id) { 
     var item = Products.FirstOrDefault(x => x.Id == id); 
     if (item != null) { 
      item.Prince += 1; 
      item.LastUpdate = DateTime.Now; 
     }  
    } 

    public static void Remove(long id) { 
     var item = Products.FirstOrDefault(x => x.Id == id); 
     if (item != null) { 
      Products.Remove(item); 
     }  
    } 
    // others methods 

}

"ロック"キーワードを使用することができますが、どこに置く必要がありますか?私のオブジェクト上に見つかりましたか?私のリストに?

ありがとう

+0

なぜ実際にそれらのオブジェクトをメモリにキャッシュしていますか? AppDomainがアンロードされたとき(またはコンピュータがクラッシュしたとき)に、データの損失を防ぐ方法を教えてください。 – Steven

答えて

1

例安全・スレッディングについてSortedList<TKey, TValue>
のために、リストの代わりにIDictionaryの使用を検討してください。あなたは

  1. lockキーワード

  2. ReaderWriterLockSlimを使用して見ることができます - 場合にのみロックします必要なもの

  3. ConcurrentDictionary<TKey, TValue> - スレッドセーフで実装されていれば十分です。

UPD:ReaderWriterLockSlimは、単純なlockキーワードよりはるかに進んでいます。 ReaderWriterLockSlimを使用すると、多くの読者はロックなしで同時にデータを取得できます。しかし、あるスレッドがデータを書き込もうとすると、他のすべてのスレッドはロックされて読み書きされます。

+0

ロックキーワードとReaderWriterLockSlimの間に相違点はありますか?ありがとう! –

+0

awser男性のおかげで、私は可能性を検討します。現在、私のプロジェクトは.Net 3.5上にあり、4.0に移行しようとしています。再度、感謝します! –

+0

@Felipeいつもようこそ。 BTW:Framework 4.0は本当においしいです。あなたは後悔しません。 –

0

商品を検索する前にロックする必要があります。

private Object syncObject = new Object(); 

public static void Increase(long id) {   
    lock(syncObject) { 
     ...  
    } 
} 

public static void Remove(long id) {   
    lock(syncObject) { 
     ...  
    } 
} 
+0

lockキーワードを使用することを選択した場合、スレッドがキャッシュから読み込む必要があるか、書き込みのみする必要があるかどうかを確認する必要がありますか?おかげで –

関連する問題