바인딩으로 인해 WPF에서 메모리 누수가 발생할 수 있습니까?
메모리 누수를 방지하기 위해 아이템이 없어지면 바인드를 풀어야 합니까?새로고침하여 새로운 템플릿이 컨트롤에 적용되고 해당 템플릿에 외부 요소에 대한 바인딩이 존재하는 경우 템플릿에 대해 작성된 컨트롤이 가비지 수집되지 않도록 할 수 있을까 하는 약간 걱정이 됩니다.
않은 DependencyProperty INotifyPropertyChanged바인딩으로 인해 메모리가 누출될 수 있으므로 작업이 완료되면 바인드를 해제해야 합니다.
그 대상이 '아니다'가 DependencyProperty 「」를 실장하고 않다.INotifyPropertyChanged 후, 「 」, 「 」를 사용합니다.ValueChanged를 PropertyDescriptors AddValueChanged 은 'CLR', 'CLR', 'CLR', 'CLR'에서 합니다.PropertyDescriptorobject은 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 |