2012-06-07 4 views
9

모든 ViewModel 사전을 만들고 싶습니다.WeakReference 이해

public static Dictionary<string, WeakReference> vmCollection = new Dictionary<string, WeakReference>(); 

vmCollection.Add(name, new WeakReference(viewModel)); 

처럼 추가와 같은 필수 메소드를 호출 ..

((vmCollection[viewModel].Target) as BaseViewModel).NewMessage(message); 

은 내가 WeakReference로 유지해야합니까? 내가 이것을 WeakReference으로 유지하지 않으면 어떤 결과가 초래 될 수 있습니다.

+3

개체가 액세스하기 전에 살아 있는지 확인하는 것을 잊지 마십시오. WeakReference의 IsAlive – Bond

+0

메시징 유형 솔루션을 구현하려는 경우 Prism의 EventAggregator를 살펴 보았습니까? – slugster

+0

감사합니다 slugster.I 모든 종류의 의존성을 피하기 위해 내 자신의 그것을 구현하고 싶습니다 ... –

답변

14

WeakReference을 사용하지 않은 유일한 결과는 사전의 참조가 View Model 인스턴스가 가비지 수집되지 못하도록한다는 것입니다. WeakReference은 가비지 수집을 허용합니다 (다른 곳에서 다른 고체 참조가 없다고 가정).

항목에 대한 참조가없는 경우 해당 항목은 가비지 수집 대상이됩니다. WeakReference은 "가산 가능"참조를 생성하지 않으므로 참조 정렬을 유지할 수 있지만 여전히보고있는 유일한 것은 WeakReference 인 경우 자격을 허용합니다.

당신이 필요로하든 아니든 상관없이 귀하의보기 모델에 어떤 종류의 라이프 사이클이 있는지에 따라 달라집니다. 처분하거나 "떠나기"가 필요한 경우 WeakReference을 사용하거나 대신 사전에서 참조를 삭제해야 할 수 있습니다.

의견에 언급했습니다. 나는 관련 객체의 라이프 사이클을 명시 적으로 처리하는 것과는 대조적으로 WeakReference을 사용하지 못하게하는 경향이 있습니다. 즉, 해당 지점에서 라이프 사이클을 쉽게 알 수 없을 때 유용합니다. 나는 귀하의 상황에서, 당신은 필요한 가시성을 가져야한다고 생각합니다. UI 레이어에서 모두 그렇기 때문에, 이 아니어야합니다.을 사용하십시오.

지침은 MSDN 링크 위의에서 추출 : 여기

이 주제에 대한 몇 가지 리소스입니다

를 사용하여 긴 약한 참조 필요한 경우에만 개체의 상태는 u입니다. 완료 후 예측할 수 없다.

포인터 그 자체가 크기가 클 수 있기 때문에 작은 개체에 약한 참조를 사용하지 마십시오.

관리 문제에 대한 자동 해결 방법으로 약한 참조를 사용하지 마십시오. 대신 응용 프로그램 개체를 처리하는 에 대한 효과적인 캐싱 정책을 개발하십시오.

마지막 지침은 귀하의 상황에 적용됩니다.

+0

고마워요 아담. 내가 그것을 사용하는 더 안전한면에 있다면 어떤 종류의 오버 헤드일까요? –

+2

@RaoBHavik 오버 헤드는'WeakReference' 객체 인스턴스 자체의 비용과 참조 된 객체가 여전히 사용 가능한지를 지속적으로 확인해야 할 필요가 있습니다 (마지막으로 사용한 이후로 수집되었을 수 있음). 필자는 객체의 라이프 사이클을 명시 적으로 처리하는 것과는 대조적으로 항상 사용하지 않을 것이지만 때로는 라이프 사이클의 가시성이 없어 유용하다고 증명할 수 있습니다. 나는 당신의 경우에 당신이 가시성을 가져야한다고 생각하므로 그것들을 사용하지 않으려 고 노력해야한다. –