c# weakreference 예제

예를 들어 일반 참조와 일부 타이머를 사용하여 캐시에서 이전 항목을 제거하는 캐싱 시스템을 만들 수 있다고 가정합니다(예: 1분 동안 사용하지 않으면 항목이 캐시에서 제거됨). 다음 예제에서는 약한 참조를 사용하여 개체의 캐시를 응용 프로그램의 리소스로 유지하는 방법을 보여 줍니다. 캐시는 인덱스 값으로 키를 수 있는 WeakReference 개체의 IDictionary를 사용하여 생성됩니다. WeakReference 개체에 대한 대상 속성은 데이터를 나타내는 바이트 배열의 개체입니다. http://msdn.microsoft.com/en-us/library/system.weakreference(v=VS.100).aspx 그래서 약한 참조는 예를 들어, 객체의 캐시를 유지하는 데 사용될 수 있습니다. 그러나 강력한 참조를 다시 설정하기 전에 가비지 수집기에서 개체에 도착할 위험이 항상 있다는 점을 기억해야 합니다. 고성능 .NET 코드를 작성할 때 는 2장(가비지 콜렉션)에서 WeakReference 유형을 간략하게 언급하지만 너무 많이 설명하지는 않습니다. 그러나 블로그의 경우 WeakReference, 작동 방식 및 사용 시기에 대한 자세한 내용을 설명하는 작은 일련의 게시물을 몇 가지 예제 구현과 함께 시작하고 싶습니다. 이 첫 번째 게시물에서는 그것이 무엇인지, 어떤 옵션이 있는지, 어떻게 사용하는지 에 대해 다룹니다. 이 예제에서는 위에서 WeakReference를 사용하는 올바른 방법과 본질적으로 동일한 사용 방법을 보여 줍니다.

그러나 스레드 안전은 약한 참조에 대한 단일 요청과만 관련이 있습니다. 예를 들어 다음 코드는 스레드에서 안전하지 않습니다. 일단 당신이 약한에 할당Ref 변수, null에 원래 강력한 참조를 설정 해야 합니다 (그렇지 않으면, 포인트는 무엇입니까?). 이제 가비지 수집이 있을 때마다 object weakRef가 참조하는 것이 수집될 수 있습니다. 이 개체에 액세스하려면 이 예제와 같이 WeakReference의 IsAlive 속성을 사용하려는 유혹이 있을 수 있습니다. 그런 다음 Target 속성을 해당 개체로 설정하고 원래 참조를 개체에 null로 설정합니다. 코드 예제는 클래스 라이브러리의 WeakReference를 참조하십시오. 이 예제에서는 캐시의 개체에 임의로 액세스합니다.

개체가 가비지 수집을 위해 회수되면 새 데이터 개체가 재생성됩니다. 그렇지 않으면 약한 참조로 인해 개체에 액세스할 수 있습니다. WeakReferences에 대해 알게 되었을 때 나는 즉시 캐싱에 유용하다고 생각했다. MSDN에서 WeakReference를 사용하는 예는 배경 이미지를 로드하고 약한 참조만 유지한 Windows Forms 응용 프로그램이었습니다. 따라서 메모리가 필요한 경우 .NET은 이러한 모든 코드가 필요할 때 배경을 다시 로드하여 배경을 다시 로드할 수 있으므로 메모리에서 배경을 제거할 수 있다는 것을 알고 있었습니다. 그 이유는 첫 번째 예에서와 동일하며, if와 DoSomething 사이에 값이 수집될 수 있습니다. 그것은 드문 일이지만, 일어날 수 있습니다. 따라서 IsAlive 속성은 단독으로 사용하는 경우에만 사용해야 합니다.

내 경우에는 일반적으로 해당 콘텐츠가 이미 수집되었을 때 컬렉션에서 약한 참조를 제거하려는 경우에만 이러한 속성을 확인하므로 IsAlive 속성을 한 번만 확인합니다. 글쎄, 첫 번째 것은 예입니다. WeakReference가 캐싱에 좋지 않은 경우 약한 참조로 저장된 배경 이미지의 예가 있는 이유는 무엇입니까? 분명히 그들은 오류를 보았다, 나는 더 이상 그 예를 찾을 수 없습니다. 이 것을 사용하는 올바른 방법은 IsAlive 속성을 완전히 무시하고 Target: 에서 강력한 참조를 시도하는 것입니다. II : GC는 사람의 다른 개체를 보유하기위한 약한 굴절 A 클래스를 수집, 우리는 캐시로 처리 가비지 수집기 응용 프로그램에서 사용 되는 개체를 수집할 수 없습니다 응용 프로그램의 코드가 해당 개체에 도달할 수 있는 동안

カテゴリー未分類