나는이 코드 세그먼트를 가지고, 많은 것들을 간결하게 생략하지만 장면이 하나입니다이 코드를 안전하게하려면 어떤 옵션이 필요합니까?
public class Billing
{
private List<PrecalculateValue> Values = new List<PrecalculateValue>();
public int GetValue(DateTime date)
{
var preCalculated = Values.SingleOrDefault(g => g.date == date).value;
//if exist in Values, return it
if(preCalculated != null)
{
return preCalculated;
}
// if it does not exist calculate it and store it in Values
int value = GetValueFor(date);
Values.Add(new PrecalculateValue{date = date, value = value});
return value;
}
private object GetValueFor(DateTime date)
{
//some logic here
}
}
나는 내가 이미 나중에 사용하기 위해 계산 된 모든 값을 저장 List<PrecalculateValue> Values
을 가지고, 나는이 작업을 수행 주로 같은 클라이언트에 대해 두 번 다시 계산하기를 원하지 않기 때문에 각 계산에는 많은 작업이 필요하며 500-1000ms가 소요되며 구멍에 관련된 재귀 때문에 재사용 할 수있는 큰 기회가 있습니다 청구 클래스.
두 개의 서로 다른 클라이언트에 대해 두 개의 동시 계산을 수행하는 테스트를 수행 할 때까지이 모든 작업이 완벽하게 수행되며 컬렉션에 둘 이상의 결과가 발견되어 Values.Single(g => g.date == date).value
라인이 예외를 반환했습니다. 그래서 목록을 확인하고 동일한 목록에 두 클라이언트의 값을 저장합니다. 이 작은 문제를 피하려면 어떻게해야합니까? 우선
+1은 DateTime에 입력 된 사전을 사용합니다. 또한 .NET 4를 사용하는 경우 새 객체를 추가 할 때 잠금을 처리하는 새로운 ConcurrentDictionary가 있습니다. –
hehe, 네, 그 논평 if's 실제로 논리의 일부입니다 =), 그것에 대해 부러워. 나중에 시도해 보도록하겠습니다. – JOBG
ConcurrentDictionary, nice –