企業ライブラリのドキュメントは言う:私のIBackingStoreはスレッドセーフである必要がありますか?
ため、キャッシュオブジェクトの動作方法を、あなたはシングルスレッドな方法で任意のバッキングストアが と呼ばれること を保証されています。この は、 の実装スレッドを安全にする必要はありません。
とのCacheManagerに関する:
のCacheManagerオブジェクトを介して行われたすべてのメソッド呼び出しは、スレッドセーフです。
しかし、簡単なテスト反対を証明する:
ここにここに私のカスタムバッキングストア(のみAddメソッドが関連している)
public class MyStore : IBackingStore
{
volatile bool isEntered = false;
#region IBackingStore Members
public void Add(CacheItem newCacheItem)
{
if(isEntered)
throw new NotImplementedException();
isEntered = true;
Thread.Sleep(1000);
isEntered = false;
}
public int Count
{
get
{
throw new NotImplementedException();
}
}
public void Flush()
{
throw new NotImplementedException();
}
public System.Collections.Hashtable Load()
{
return new System.Collections.Hashtable();
}
public void Remove(string key)
{
throw new NotImplementedException();
}
public void UpdateLastAccessedTime(string key, DateTime timestamp)
{
throw new NotImplementedException();
}
#endregion
#region IDisposable Members
public void Dispose()
{
throw new NotImplementedException();
}
#endregion
}
とが同じのCacheManagerへのテストウィッヒアクセスです
DictionaryConfigurationSource configSource = new DictionaryConfigurationSource();
CacheManagerSettings cacheSettings = new CacheManagerSettings();
configSource.Add(CacheManagerSettings.SectionName, cacheSettings);
CacheStorageData storageConfig = new CacheStorageData("MyStorage", typeof(MyStore));
cacheSettings.BackingStores.Add(storageConfig);
CacheManagerData cacheManagerData = new CacheManagerData("CustomCache", 120, 100, 5, storageConfig.Name);
cacheSettings.CacheManagers.Add(cacheManagerData);
cacheSettings.DefaultCacheManager = cacheManagerData.Name;
CacheManagerFactory cacheFactory = new CacheManagerFactory(configSource);
ICacheManager cacheManager = cacheFactory.CreateDefault();
Thread thread = new Thread(() =>
{
cacheManager.Add("item1", "odaiu");
});
thread.Start();
cacheManager.Add("item2", "dzaoiudoiza");
Addメソッドは2つの異なるスレッドで2回実行されますそれはAddメソッドの "NotImplementedException"をスローします)。
私のコードに問題がありますか、エンタープライズライブラリのドキュメントが間違っていますか?