2017-01-29 1 views
0

UWP (XAML/C#)에서 Frame.Navigate(typeof(Page2));을 사용하고 Page2의 C#에서 타이머를 사용하고 Frame.GoBack();을 사용할 때 프레임이 실제로 돌아가지만 타이머가 중지되지 않습니다. 페이지와 모든 구성 요소가 백그라운드에서 계속 실행 중이고 앱이 너무 많은 RAM을 소비하고 있다는 것을 의미합니다. 어떻게 페이지를 "죽일 수 있습니까?"페이지 탐색 및 백그라운드에서 실행 중

참고 :

+0

당신은 무엇 타이머를 사용합니까 같은 진단 도구 위와 도움이되지 않는이, 비주얼 스튜디오에 포함 된 경우 메모리 누수를 찾기 위해 메모리 프로파일 러를 사용하는 것이 좋습니다까요? – Yarik

+0

'Windows.UI.Xaml.DispatcherTimer'하지만 타이머의 문제는 아닙니다 (타이머 및 중단 점이 _timer.Tick에서 발견되었지만 문제는 모든 구성 요소와 모든 페이지가 백그라운드에 있음을 나타냅니다) . – Peter

+1

페이지에서 벗어나면 명시 적으로 타이머를 중지하는 것을 잊지 마십시오. 'DispatcherTimer'는'Dispatcher'와 실행중인 페이지 사이에 강력한 참조를 만듭니다. – Yarik

답변

1

그 CLR 가비지 수집기를 이해하는 것이 중요하다는 살인 "을 담당하는 하나입니다 .. 사용자가이 탐색 10 번을 사용하는 경우, 페이지가 백그라운드에서 10 배이며 나쁜 "사용하지 않는 개체. 객체 (및 그것의 모든 멤버)는 더 이상 참조되지 않을 때 "사용되지 않음"이됩니다.

Windows.UI.Xaml.DispatcherTimer을 시작하면 현재 Dispatcher 내부 타이머 컬렉션에 추가되므로 Dispatcher과 타이머 사이에 직접 참조가 생성됩니다. 타이머는 차례로 실행중인 페이지에 대한 참조를 보유합니다. Dispatcher은 전역 개체이므로 타이머가 중지 될 때까지 페이지가 활성 상태를 유지합니다.

를 포함하여 메모리 누수의 다른 원인 (이 꽤 광범위한 주제입니다)가있을 수 있습니다 :

페이지에 직접 또는 간접 참조의
  • 다른 소스
      ;
    • 정적 이벤트 구독.
    • 복잡한 데이터 바인딩은 {Binding Path=Property.Subproperty}과 같습니다.

    난 당신이 2015 년

  • 관련 문제