바인딩으로 인해 WPF에서 메모리 누수가 발생할 수 있습니까?
메모리 누수를 방지하기 위해 아이템이 없어지면 바인드를 풀어야 합니까?새로고침하여 새로운 템플릿이 컨트롤에 적용되고 해당 템플릿에 외부 요소에 대한 바인딩이 존재하는 경우 템플릿에 대해 작성된 컨트롤이 가비지 수집되지 않도록 할 수 있을까 하는 약간 걱정이 됩니다.
않은 DependencyProperty
INotifyPropertyChanged
바인딩으로 인해 메모리가 누출될 수 있으므로 작업이 완료되면 바인드를 해제해야 합니다.
그 대상이 '아니다'가 DependencyProperty
「」를 실장하고 않다.INotifyPropertyChanged
후, 「 」, 「 」를 사용합니다.ValueChanged
를 PropertyDescriptors
AddValueChanged
은 'CLR', 'CLR', 'CLR', 'CLR'에서 합니다.PropertyDescriptor
object
은 CLR에 합니다.PropertyDescriptor
글로벌 테이블에 있습니다.
바인딩은 변경을 계속 수신해야 하기 때문입니다., 는, 「어느 쪽인가」, 「어느 쪽인가」의 사이에 유지됩니다.PropertyDescriptor
및object
★★★★★★★★★★★★★★★★★★★★★★★★★★★★★★★★★★★★★★로 인해 메모리 할 수 .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 문서를 참조해 주세요.
유용한 링크:
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
'source' 카테고리의 다른 글
변수의 값을 명령어의 표준 입력에 전달하려면 어떻게 해야 합니까? (0) | 2023.04.12 |
---|---|
WPF에서 "Capture the mouse"는 무엇을 의미합니까? (0) | 2023.04.12 |
TRIM이 인식되는 내장 함수 이름이 아닙니다. (0) | 2023.04.12 |
윈도 인스턴스의 hWnd를 얻는 방법 (0) | 2023.04.12 |
ITMS-90717 오류: "잘못된 앱 스토어 아이콘" (0) | 2023.04.12 |