はじめに
.NET Framework 4 で追加された機能で、地味に期待していたのが System.Runtime.Caching。ASP.NET のセッションストレージみたいな機能が、コンソールアプリやデスクトップアプリでも使えるようになった。
今まではデータのキャッシュに Enterprise Library の Caching Application Block を使っていたけど、せっかく標準で用意されたのだから置き変えたい。
そこで System.Runtime.Caching をちょっと調べてみた。
MemoryCache を使ってみる
準備
プロジェクトの参照に System.Runtime.Caching を追加する。
System.Runtime.Caching は .NET Framework 4 Client Profile には含まれていない。プロジェクトの『対象のフレームワーク』で『.NET Framework 4』を指定しないと、参照の一覧に挙がってこないので注意。
オブジェクトをキャッシュしてみる
MemoryCache のインスタンスを生成するときは、キャッシュに名前を付ける必要がある。名前付けるのが面倒なので、今回は Default を利用。
{ MemoryCache cache = MemoryCache.Default; cache["Foo"] = new Tuple<int, int>(100, 200); } { MemoryCache cache = MemoryCache.Default; Console.WriteLine(((Tuple<int, int>)cache["Foo"]).Item1); //=> 100 }
前回参照時から3秒以上参照されなかったら削除してみる
{ MemoryCache cache = MemoryCache.Default; cache.Add("Bar", 300, new CacheItemPolicy() { SlidingExpiration = new TimeSpan(0, 0, 3), }); } { MemoryCache cache = MemoryCache.Default; Console.WriteLine(cache["Bar"]); //=> 300 Thread.Sleep(3000); Console.WriteLine(cache["Bar"]); //=> }
キャッシュしてから3秒以上たったら強制的に削除してみる
{ MemoryCache cache = MemoryCache.Default; cache.Add("Hoge", 400, new CacheItemPolicy() { AbsoluteExpiration = DateTimeOffset.Now.AddSeconds(3.0), }); } { MemoryCache cache = MemoryCache.Default; Console.WriteLine(cache["Hoge"]); //=> 400 Thread.Sleep(3000); Console.WriteLine(cache["Hoge"]); //=> }
キーを削除したときに何かしてみる
{ MemoryCache cache = MemoryCache.Default; cache.Add("Fuga", 400, new CacheItemPolicy() { RemovedCallback = arg => { Console.Write("キー{0}が削除されました。", arg.CacheItem.Key); } }); } { MemoryCache cache = MemoryCache.Default; cache.Remove("Fuga"); //=> キーFugaが削除されました。 }
UpdateCallback というプロパティもあるけど、これにコールバックを設定しようとすると ArgumentException が発生する。使ってはいけない。
MSDNによるとカスタムプロバイダが作れるみたい
肝心の作り方を見つけられなかったけど。ASP.NET のカスタムプロバイダと同じ?後でまた調べてみよう。
将来 Web サービスや Windows Azure で使うことを考えると、Memcached や Velocity といった分散キャッシュ用のカスタムプロバイダが必要になりそう。Velocity 用プロバイダは Microsoft が提供してくれるだろう。Memcached 用プロバイダはそのうち、CodePlex あたりで誰かが公開しそう。
まとめ
今まで Enterprise Library の Caching Application Block を使っていたけど、System.Runtime.Caching で十分。