この動作がアプリケーション (コンソール アプリケーション) の性質によるものかどうかはわかりません。私の最終目標はSystem.Runtime.Caching.MemoryCache
、ASP.Net MVC アプリケーションで使用されるクラス ライブラリのクラスを使用することです。目標は、ネットワーク フォルダーで XML ファイル (データ ソース) が変更されるたびに設定される MemoryCache からデータを返すことです。
そのため、実装を行うために、List<>
キャッシュされるオブジェクトの単純なコンソール アプリを作成しました。これがコードです。
using System;
using System.Collections.Generic;
using System.Runtime.Caching;
using CachePersons.Core.Logging;
namespace CachePersons
{
class Program
{
static void Main(string[] args)
{
GetPersons();
GetPersons();
GetPersons();
Console.ReadKey();
}
static List<string> GetPersons()
{
List<string> persons;
Log.Debug("Entered GetPersons()");
Console.WriteLine("Entered GetPersons()");
//get default cache
ObjectCache cache = MemoryCache.Default;
//get persons
persons = (List<string>)cache.Get("Persons");
//if cache does not contain the persons, create new list and add it to cache
if (persons == null)
{
persons = GetPersonsFromDatabase();
cache.Add("Persons", persons, new CacheItemPolicy());
}
else
{
Log.Debug(" Found Data in Cache!");
Console.WriteLine(" Found Data in Cache!");
}
Log.Debug("Exited GetPersons()");
return persons;
}
static List<string> GetPersonsFromDatabase()
{
Log.Debug(" Populating Cache 1st time.");
Console.WriteLine(" Populating Cache 1st time.");
return new List<string>()
{
"John Doe",
"Jane Doe"
};
}
}
}
次に、プロジェクトをビルドし、2 つの個別のコマンド ウィンドウを開き、1 つずつ実行しました。DebugView、コンソール出力で私が期待するのは、キャッシュが読み込まれるのは 1 回だけで、2 回目の .exe 呼び出しでキャッシュ内のデータが検索され、そこから返されることです。 . しかし、それは起こっていることではありません。以下のコンソールと debugview のスクリーンショットを参照してください。
そしてDebugViewで...
私は何を間違っていますか?この動作は、コンソール アプリを使用しているためですか? クラス ライブラリのメソッド呼び出し全体でキャッシュを機能させるにはどうすればよいですか? また、同じライブラリが Web アプリ (IIS 7.5 の ASP.Net MVC ) で使用されている場合、どのような考慮事項に注意する必要がありますか。
ありがとうございました!