다음과 같은 방법이 있습니다 (프리즘 용 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();
}
}
}
}
감사합니다,
밥을 다음과 같이 메모리 누수
실제 코드입니다.
왜 메모리 누출이 있다고 생각합니까? 'Adapt' 메쏘드를 포함하는 클래스의 인스턴스는'Views' 인스턴스가 참조 된 채로있는 한 메모리에 남아 있습니다. 'region'이 모일 때'Adapter'도 마찬가지입니다. 귀하의 지역은 정적 인스턴스에 대한 참조입니까? – Steven
'OnViewsCollectionChanged' 메소드를 정적 (가능한 경우)으로 만들면,'Adapter'가 참조되지 않습니다. – Steven
사실,이 문제를 재현하는 가장 작은 비트입니다. 가장 많이 사용 된 영역에는 무제한 뷰가 주입됩니다. 나는 나쁜 메모리 누출의 원인을 보여주기 위해 질문을 업데이트 하겠지만, unsubscribing = memory leak가 아니라는 것을 이해할 것입니다. –