2011-12-28 4 views
2

다음과 같은 방법이 있습니다 (프리즘 용 RegionAdapter에서).
메모리 누수 및 로컬 변수

protected override void Adapt(IRegion region, DocumentPane regionTarget) 
{ 
    region.Views.CollectionChanged += delegate(object sender, NotifyCollectionChangedEventArgs e) 
    { 
     OnViewsCollectionChanged(sender, e, region, regionTarget); 
    }; 
} 

내 문제는 경우에이 방법을 가입하여, 나는 메모리 누수가 있다는 것입니다. 그러나 region 및 regionTarget 매개 변수는 Adapt의 지역 변수입니다. 내가 나중에 이벤트를 취소 할 수 있도록

어떻게 그것을 처리해야 ...

나는 누군가가 다른 시나리오를 처리 있는지 확인하기 위해이를 찾는 시도하지만, MSDN 및 MVP가 모든이 새는 방법을 사용?

편집 :
위의 코드는 내가 분명히 문제를 보여줍니다 생각 그냥 예입니다.

private void OnViewsCollectionChanged(object sender, 
    NotifyCollectionChangedEventArgs e, IRegion region, 
    DocumentPane regionTarget) 
{ 
    if (e.Action == NotifyCollectionChangedAction.Add) 
    { 
     //Add content panes for each associated view. 
     foreach (object item in e.NewItems) 
     { 
      UIElement view = item as UIElement; 

      if (view != null) 
      { 
       DockableContent newContentPane = new DockableContent(); 
       newContentPane.IsCloseable = true; 
       newContentPane.HideOnClose = false; 

       ScrollViewer sViewer = new ScrollViewer() 
       { 
        Content = item, 
        HorizontalScrollBarVisibility = ScrollBarVisibility.Auto, 
        VerticalScrollBarVisibility = ScrollBarVisibility.Auto 
       }; 
       newContentPane.Content = sViewer; 

       //When contentPane is closed remove the associated region 
       // (MEMORY LEAK) 
       newContentPane.Closed += (contentPaneSender, args) => 
       { 
        DockableContent docker = 
         contentPaneSender as DockableContent; 
        ScrollViewer scroller = docker.Content as ScrollViewer; 
        region.Remove(scroller.Content); 
        IDisposable dispView = scroller.Content as IDisposable; 
        if (dispView != null) dispView.Dispose(); 
        scroller.Content = null; 
       }; 
       regionTarget.Items.Add(newContentPane); 
       newContentPane.Activate(); 
      } 
     } 
    } 
} 

감사합니다,

밥을 다음과 같이 메모리 누수
실제 코드입니다.

+0

왜 메모리 누출이 있다고 생각합니까? 'Adapt' 메쏘드를 포함하는 클래스의 인스턴스는'Views' 인스턴스가 참조 된 채로있는 한 메모리에 남아 있습니다. 'region'이 모일 때'Adapter'도 마찬가지입니다. 귀하의 지역은 정적 인스턴스에 대한 참조입니까? – Steven

+0

'OnViewsCollectionChanged' 메소드를 정적 (가능한 경우)으로 만들면,'Adapter'가 참조되지 않습니다. – Steven

+0

사실,이 문제를 재현하는 가장 작은 비트입니다. 가장 많이 사용 된 영역에는 무제한 뷰가 주입됩니다. 나는 나쁜 메모리 누출의 원인을 보여주기 위해 질문을 업데이트 하겠지만, unsubscribing = memory leak가 아니라는 것을 이해할 것입니다. –

답변

0

익명 대신 구체적인 방법을 사용하십시오. 예 :

private Region _region; 
    DocumentPane _regionTarget 
    protected override void Adapt(IRegion region, DocumentPane regionTarget) 
    { 
     _region = region; 
     _regionTarget = regionTarget; 
     region.Views.CollectionChanged += OnCollectionChanged; 
    } 

    private void OnCollectionChanged (object sender, NotifyCollectionChangedEventArgs e) 
    { 
     OnViewsCollectionChanged(sender, e, _region, _regionTarget); 
    } 

    ... 
    private void Unsubscribe() 
    { 
     _region.Views.CollectionChanged -= OnCollectionChanged; 
    } 
+0

코드가 컴파일되지 않습니다. region 및 regionTarget은 OnCollectionChanged 메서드에 대해 알 수없는 변수입니다. 그들은 Adapt의 지역입니다. –

+0

죄송합니다. 고정되어 있습니다. – Elastep

+0

저는 그것에 대해 생각했지만, 이제는이 두 변수가 더 이상 로컬이 아니며, 전역 변수입니다. 나는 어쩌면 대리모들과 함께 트릭을 사용하는 또 다른 방법이있을 것이라고 확신합니다 ... 당신의 의견을 고맙습니다. –