나는 다음과 같은 코드가 있습니다이 특정 유형의 잠금을 수행하는 방법은 무엇입니까?
var sequence = from row in CicApplication.DistributorBackpressure44Cache
where row.Coater == this.Coater && row.IsDistributorInUse
select new GenericValue
{
ReadTime = row.CoaterTime.Value,
Value = row.BackpressureLeft
};
this.EvaluateBackpressure(sequence, "BackpressureLeftTarget");
다음과 같이 DistributorBackpressure44Cache 정의됩니다 :
internal static List<DistributorBackpressure44> DistributorBackpressure44Cache
{
get
{
return _distributorBackpressure44;
}
}
이 DistributorBackpressure44Cache은 하나 개의 스레드에서 갱신, 그리고에서 조회되는 수 무겁게 스레드 응용 프로그램의 일부입니다 위에 표시된 것처럼 다른 스레드에서. 위의 변수 'sequence'는 IEnumerable이며 표시된 메서드에 전달 된 다음 실제로 실행되기 전에 다른 메서드로 전달 될 수 있습니다. 제 관심은 이것입니다. 쿼리가 실제로 실행될 때 DistributorBackpressure44Cache가 새로 고쳐지거나 (지워지고 다시 채워지는) 위의 쿼리는 어떻게됩니까?
이 코드가 실제로 어떤 시점에서 나중에 실행되기 때문에이 코드 주위에 잠금을 설정하는 것은 좋지 않습니다 (목록으로 즉시 변환하지 않는 한).
는 사실은 이미 두 번째 부분을하고 있어요.그러나 쿼리를 즉시 실행하는 쿼리에 .ToList()를 추가하지 않으면 쿼리가 실제로 나중에 어떤 시점 (즉, Linq 작동 방식)에서 실행되기 때문에 쿼리를 둘러싼 잠금을 설정하면 어떤 이점이 있습니까? . –
그러면 lock()에서 LINQ의 실제 평가 (즉, for 루프)를 둘러 쌀 수 있습니다. –
특히 Nreaders >> Nwriters 인 경우 판독기 - 기록기 잠금이 모니터 잠금보다 우수합니다. – user7116