source

바인딩으로 인해 WPF에서 메모리 누수가 발생할 수 있습니까?

ittop 2023. 4. 12. 23:00
반응형

바인딩으로 인해 WPF에서 메모리 누수가 발생할 수 있습니까?

메모리 누수를 방지하기 위해 아이템이 없어지면 바인드를 풀어야 합니까?새로고침하여 새로운 템플릿이 컨트롤에 적용되고 해당 템플릿에 외부 요소에 대한 바인딩이 존재하는 경우 템플릿에 대해 작성된 컨트롤이 가비지 수집되지 않도록 할 수 있을까 하는 약간 걱정이 됩니다.

않은 DependencyProperty INotifyPropertyChanged바인딩으로 인해 메모리가 누출될 수 있으므로 작업이 완료되면 바인드를 해제해야 합니다.

그 대상이 '아니다'가 DependencyProperty 「」를 실장하고 않다.INotifyPropertyChanged 후, 「 」, 「 」를 사용합니다.ValueChangedPropertyDescriptors AddValueChanged 'CLR', 'CLR', 'CLR', 'CLR'에서 합니다.PropertyDescriptorobject은 CLR에 합니다.PropertyDescriptor글로벌 테이블에 있습니다.

바인딩은 변경을 계속 수신해야 하기 때문입니다., 는, 「어느 쪽인가」, 「어느 쪽인가」의 사이에 유지됩니다.PropertyDescriptorobject★★★★★★★★★★★★★★★★★★★★★★★★★★★★★★★★★★★★★★로 인해 메모리 할 수 .object 임의의 and and and and andobject어느 쪽인가object참조. 여기에는 데이터 바인딩 타깃이 포함됩니다.

, 에 하고 있는 는, 「」로 합니다.DependencyProperty ★★★★★★★★★★★★★★★★★」INotifyPropertyChanged 않으면 다른 해야 합니다.그렇지 않으면 다른 서브스크라이브된 이벤트와 마찬가지로 바인딩을 해제해야 합니다.


편집: 에서 수정되었을 가능성이 있습니다.약한 이벤트/참조를 사용한NET4.5 단, 몇 가지 간단한 테스트를 실시한 결과 동일한 것으로 생각되었습니다.확인하려면 좀 더 자세히 조사해야 합니다.따라서 개인적으로는 4.5로 수정될 수 있습니다.

대답하는 척하지 말고 참고하세요.WPF 어플리케이션에서 메모리 누수가 발생할 수 있는 경우에 대해 자세히 설명한 저자 Josef Goldberg에 관한 고전적인 기사.대부분의 경우 와 관련되어 있습니다.NET 3.5/4.0 단, 경우에 따라서는 이 날과 관련된 경우가 있습니다.또, 내선번호가 작습니다.

Binding:

Cause:

이 누수는 이 kb 기사에 기재되어 있습니다.다음 이유로 트리거됩니다.

TextBlock에는 컨트롤에 .TextBlock (myGrid 이이'' ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ()

Note:이러한 유형의 DataBinding 누출은 특정 시나리오(모든 DataBinding 시나리오가 아닌)에 고유한 것임을 kb 기사에 기재되어 있습니다.의 속성Path가 아니다DependencyProperty그리고 그 수업에는 없는 것 같아요.INotifyPropertyChanged또한 강력한 참조 체인이 존재해야 합니다.

코드:

myDataBinding = new Binding("Children.Count");
myDataBinding.Source = myGrid; 
myDataBinding.Mode = BindingMode.OneWay;
MyTextBlock.SetBinding(TextBlock.TextProperty, myDataBinding);

같은 누출 코드를 XAML에도 쓸 수 있습니다.

<TextBlock Name="MyTextBlock" 
           Text="{Binding ElementName=myGrid, Path=Children.Count}" />

Fix/Workaround:

몇 가지 방법이 있는데, 가장 쉬운 방법은 창이 닫히려고 할 때 바인딩을 삭제하는 것입니다.

예:

BindingOperations.ClearBinding(MyTextBlock, TextBlock.TextProperty);

다른 방법은 데이터 바인딩 모드를 OneTime으로 설정하는 것입니다.기타 아이디어에 대해서는 kb 문서를 참조해 주세요.

유용한 링크:

DataBinding에 의한 WPF 메모리누전 회피

http://msdn.microsoft.com/en-us/library/aa970850.aspx,에서 WPF는 Weak Event Patterns를 사용합니다.Weak Event Patterns는 오브젝트에 대한 강한 참조를 보유하지 않고 오브젝트에 대한 유일한 참조일 경우 GC를 실행할 수 있습니다.

"WPF 데이터 바인딩의 많은 측면에서는 이미 이벤트가 구현되는 방식에 약한 이벤트 패턴이 적용되어 있습니다."

하지만 약한 이벤트는DependencyProperties그리고.INotifyPropertyChanged오브젝트, 즉, 다른 바인딩 모드를 사용하여 POCO에 바인드하고 있는 경우OneTime결국 메모리 누수가 될 수 있습니다.

언급URL : https://stackoverflow.com/questions/18542940/can-bindings-create-memory-leaks-in-wpf

반응형