다음 클래스가 있습니다.C#에서 개체 목록을 포함하는 사전에 잠금을 사용하는 방법?
public static class HotspotsCache
{
private static Dictionary<short, List<HotSpot>> _companyHotspots = new Dictionary<int, List<HotSpot>>();
private static object Lock = new object();
public static List<HotSpot> GetCompanyHotspots(short companyId)
{
lock (Lock)
{
if (!_companyHotspots.ContainsKey(companyId))
{
RefreshCompanyHotspotCache(companyId);
}
return _companyHotspots[companyId];
}
}
private static void RefreshCompanyHotspotCache(short companyId)
{
....
hotspots = ServiceProvider.Instance.GetService<HotspotsService>().GetHotSpots(..);
_companyHotspots.Add(companyId, hotspots);
....
}
문제는 RefreshCompanyHotspotCache 메서드에서 핫스팟을 가져 오는 작업에 많은 시간이 소요된다는 것입니다. 따라서 특정 CompanyId에 대해 하나의 스레드가 캐시 새로 고침을 수행하는 동안이 작업이 완료 될 때까지 다른 모든 스레드가 대기하고 있지만 목록이 이미로드 된 다른 회사 ID의 핫스팟 목록을 요청하는 스레드가있을 수 있습니다. 사전. 이 마지막 스레드를 잠그지 않았 으면합니다. 또한 캐시에 아직로드되지 않은 회사의 핫 스폿 목록을 요청하는 모든 스레드가 목록이 완전히 검색되어 사전에로드 될 때까지 대기하도록합니다.
특정 companyId (새로 고침이 수행되는)에 대한 캐시 읽기/쓰기 스레드 만 잠그고 다른 회사의 데이터를 요청하는 다른 스레드가 작업을 수행하도록 할 수 있습니까?
제 생각은 잠금 장치를 사용하고 배열하는 것이 었습니다.
lock (companyLocks[companyId])
{
...
}
하지만 아무 것도 해결하지 못했습니다. 한 회사를 다루는 스레드는 여전히 다른 회사의 캐시를 새로 고치는 스레드를 기다리고 있습니다.
코드를 여기에 배치 했으므로 GetCompanyHotspots를 호출하면 명시 적으로 새로 고침됩니다. 캐시 된 데이터를 읽는 적이 있습니까? –
여기가 캐시 된 데이터를 읽습니다. return _companyHotspots [companyId]; 매번 명시적인 새로 고침을 수행하지 않습니다. – lukdevil
"if dictionary.containsKey (id) {refresh (id);} 사전 [id];을 (를) 반환했습니다." containsKey가 false를 돌려주는 경우, 리프레쉬되지 않지만, return 스테이트먼트는 null를 돌려줍니다. containsKey가 true를 돌려주는 경우, 명시적인 리프레쉬를 실시해, 새롭게 리프레쉬 된 값을 돌려줍니다. 새로 고침이없는 _companyHotspots는 어디에서 읽습니까? –