2009-06-28 2 views
0

엔터프라이즈 라이브러리의 문서는 말한다 :내 IBackingStore는 스레드로부터 안전해야합니까?

때문에 캐시 개체가 어떤 백업 저장소가 단일 스레드 방식으로 호출 할 것이다, 당신이 보장의 작동 방식의

. 이 은 구현 스레드를 안전하게 만들 필요가 없음을 의미합니다.

그리고 CacheManager에 관하여 :

CacheManager 객체를 통해 만들어진 모든 메서드 호출이 스레드 안전합니다.

그러나 간단한 테스트는 반대로 증명 : 여기

내 사용자 지정 백업 저장소입니다 여기에 같은 CacheManager에 테스트 느릅 나무 접속되어

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 
} 

(만 추가 방법은 관련) 그리고 추가 방법은 becau (서로 다른 두 가지 스레드에서 두 번 실행

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 메소드의 "NotImplementedException"을 던집니다.

내 코드에 문제가 있거나 엔터프라이즈 라이브러리의 설명서가 잘못 되었습니까?

답변

0

설명서에 대한 설명이 너무 명확하므로이 설명서를 신뢰할 수 있습니다.

클래스에 대해 명시 적 다중 스레드 사용 사례를 작성한다는 증거가 잘못되었습니다. 스레드를 안전하게 만드는 특정 인터페이스에는 고유 한 것이 없습니다. 따라서 이것은 확실히 실패 할 것입니다.

엔터프라이즈 라이브러리는 스레드를 안전하게 관리하기 위해 인터페이스를 보장합니다. 내부적으로는 클래스의 스레드 안전성을 관리하는 데주의를 기울일 것입니다.

참고 :이 라이브러리에 대한 구체적인 지식은 없지만 명시 적으로 문서화하면 신뢰할 수 있습니다.

0

JaredPar는 문서에 액세스가 동기화되어있어 쓰레드가 안전하다고 동의합니다. 그러나 전달 된 백업 스토어의 구현을위한 소스 코드를 보면 멀티 스레드 환경에서 실행될 것으로 기대되는 코드로 표시됩니다. 아마도 부적절한 문서화 일 수 있습니다.

다음 발췌는 EntLib 5.0의 IsolatedStorageBackingStore에서 발췌 한 것으로, 4.1 구현이 동일하다고 생각한 것입니다. 발췌 부분은 명확하게하기위한 하나의 방법 일 뿐이지 만 기본 IsolatedStorageFile에 대한 모든 액세스는 잠겨 있습니다.

/// <summary> 
/// Adds new item to persistence store 
/// </summary> 
/// <param name="storageKey">Unique key for storage item</param> 
/// <param name="newItem">Item to be added to cache. May not be null.</param> 
protected override void AddNewItem(int storageKey, CacheItem newItem) 
{ 
    lock (store) 
    { 
     string storageLocation = GenerateItemLocation(storageKey); 
     IsolatedStorageCacheItem cacheItem = 
      new IsolatedStorageCacheItem(store, storageLocation, this.encryptionProvider); 
     cacheItem.Store(newItem); 
    } 
}