홈>
반사를 사용하는 코드를 작성 중입니다. 그래서 고가의 리플렉션 처리를
ConcurrentDictionary
에 캐시하려고합니다.
. 그러나 이전 및 사용하지 않는 캐시 된 값을 저장하지 않도록 동시 사전에 제한 제한을 적용하고 싶습니다.
ConcurrentDictionary
의 크기를 제한하는 방법을 알아보기 위해 연구를했습니다.
. 흥미로운 답변을 찾았지만 답변이 내 요구 사항에 맞는지 잘 모르겠습니다.
저는 Dapper 소스 코드에서 발견했습니다.
ConcurrentDictionary
의 한계를 처리하기 위해 사용자 정의 코드를 만들었습니다.
. Interlocked 와 함께 사용하는 수집 제한 상수가 있습니다. 사전의 동시성을 처리 할 수 있어야합니다.
반면, 나는 SO에서 답변 을 찾았습니다. 와이즈 비즈 동시성을 처리합니다. .Net 소스 코드에서 동일한 구현인지 모르겠습니다.
dapper 구현 또는 SO 응답 구현으로 가야합니까?
ReaderWriterLockSlim
관련 질문
- c# - 구성 유효성 검사를 위해 여러 목록에서 중복 항목 찾기
- c# - 얼마나 많은 메모리가 바이트 열거를 사용하고 이것이 C #에서 메모리/속도를 최적화합니까?
- c# - 객체를 포함하는 사전으로 문자열 역 직렬화
- C #에서 인스턴스 메서드 사전을 만들고 적용 할 수 있습니까?
- multithreading - C #의 각 스레드에 참조 형식을 복사하지 않는 데 성능상의 단점이 있습니까?
- c# - 문자열 변수와 세 개의 int 변수를 보유하는 사전을 만드는 방법
- 사전에서 내부 해시 세트를 조회하고 C #에서 키 값을 반환하는 방법은 무엇입니까?
- c# - 사전 int 값을 기존 int 변수에 추가하는 방법
- c# - XML 파일에서 요소 값을 찾는 가장 좋은/가장 빠른 방법
"캐시 정보"에 관한 정확한 방법은 환경에 따라 다릅니다. 웹 개발과 같은 영역은 환경의 대규모 병렬 특성과 높은 수준의 분리 덕분에 완전히 다른 접근법이 필요합니다.
그러나 캐싱을 수행하는 핵심은 WeakReference입니다. 강력한 참조는 GC에 의한 수집을 방지합니다. 약한 참조는 아니지만 강력한 참조를 얻을 수 있습니다. 프로그래머는 "이 목록을 위해서만 메모리에 보관하지 마십시오. 아직 수집하지 않았다면 참조하십시오.":https://msdn.microsoft.com/en-us/library/system.weakreference.aspx
GC는 본질적으로 다른 모든 스레드가 일시 중지 된 경우에만 해당 mater에 대한 약한 참조를 수집하거나 태그 할 수 있습니다. 따라서 WeakReferences는 추가 경쟁 조건에 노출되어서는 안됩니다. 여전히 존재하고 있으며 강력한 참조가 있거나 그렇지 않습니다.