2010-01-08 4 views
5

RoutedUICommand에 CommandBinding이있는 사용자 정의 컨트롤을 만들면 메모리 누수가 발생합니다.WPF에서 메모리 바인딩 명령이 누락되었습니다.

시나리오 :

난 사용자 컨트롤에있는 CommandBindings를 구현 내 명령을 저장할 위치를 C 클래스의 정적으로 RoutedUICommand 되세요. 기본 폼에 사용자 정의 컨트롤을 추가하십시오. 기본 폼에서 사용자 정의 컨트롤을 제거하고 해당 참조를 null로 설정하십시오.

명령 바인딩의 canExecute가 계속해서 발생합니다. 나는 UserControl에 대한 참조가 없어서 누출되었습니다. 양식을 닫은 후에도 오랫동안 계속 실행됩니다. (나는 그것을 멈추는 것을 보았습니다.) 만약 내가 쓰레기를 강제로 수집하면 수집됩니다. (canExecute가 멈추는 것을 잘합니다.)

저는 이것을 테스트하는 project을 가지고 있습니다. 메서드를 실행하는 객체의 해시 코드를 출력하는 canExecute에 Console.WriteLine이 있습니다. 새 사용자 정의 컨트롤을 추가하는 버튼과 제거하기위한 버튼이 있습니다.

이 문제에 관해서는 안됩니까? 사용자 정의 컨트롤은 강제로 수집됩니다. 이것은 다음 컬렉션에서 수집된다는 의미입니까? 메신저 응용 프로그램에서 성능 저하를 감지하고 메모리 누수를 추적하고 있습니다. 우리는 UI 요소가 많은 복잡한 양식을 가지고 있으며 레이아웃에서 제거 될 때 프로세서와 메모리 공간을 사용하여 주변에 매달려 있습니다. (우리는 많은 명령을 사용합니다) 시각적 트리에서 뭔가가 제거되면 라우트 된 이벤트를 더 이상 수신 할 수 없다고 생각했습니다. 내가 뭘 놓치고 있니?

답변

1

제 생각에 명령 바인딩은 WeakEvent pattern과 비슷한 (그러나 같지는 않습니다) 것을 사용합니다.

기본적으로 WeakReference이 유지됩니다. 이렇게하면 참조가 사라지더라도 작동 할 수 있지만 참조하는 사람이 없을 때 수업이 GC에 의해 수집되지 않습니다.

즉, 걱정하지 마세요. 작동하는 방식대로 작동합니다.

관련 문제