2011-01-28 2 views
1

주 피사체가 3 개인 피벗 항목이 있고 각 목록에 무거운 ListBox가 있습니다 (각각 약 15Mb, 보통입니까?). 몇 가지 작업이 발생하면 3 개의 항목이있는 다른 피벗 컨트롤이있는 다른 페이지로 이동합니다. 지금까지 모든 것이 좋습니다. 메인 페이지로 돌아 가면 사용한 메모리의 차이가 +2에서 + 4MB까지 나타납니다. 그리고 새 페이지로 이동하고 메인 페이지로 돌아갈 때마다 또 다른 2-4MB가 총 사용 메모리에 추가됩니다. 나는 내 코드에 아무 문제가 없다고 확신한다. 코드에 메모리 누수가 있더라도 그렇게 크지는 않습니다. 이것은 아마도 출시되지 않은 일부 UI 요소와 관련이 있습니다. 수동으로 가비지 컬렉터를 호출합니다 .NavigatedFrom과 onNavigatedTo는 두 페이지 모두에서 jsut을 사용하지만 여전히 동일합니다.WP7 메모리 누수가 있습니까? - 목록 상자 데이터 바인딩이있는 피벗 항목이 포함 된 페이지 간 이동

일부 컨트롤에서는 메모리 누수가 발생할 수 있습니까? 앞에서 말한 것처럼 두 페이지 모두 데이터 바인딩이있는 목록 상자가있는 피벗 항목이 포함되어 있으며 런타임 중에는 데이터가 변경되지 않습니다. 당신이 페이지에서 사용하는 컨트롤의 어떤 누출이있는 경우

은/각 어린이의 부모와 그에 대한 참조를 유지하기 때문에 다음이 페이지의 전체 요소 트리 (누출의 원인이됩니다 당신에게

+2

페이지의 이벤트에 대한 이벤트 처리기를 추가하고 있습니까? 이러한 이벤트를 듣지 않는 것이 메모리 누수의 일반적인 원인입니다. –

+0

두 페이지에 여러 개의 이벤트 처리기가 있지만 페이지가 파괴되면이 이벤트 핸들러가 파괴 된 것으로 생각됩니다. 안 그래요? – johnX99

+0

당신은 맞습니다. Derek .. 웹 연결을 만드는 DLL로부터 컨트롤이 있습니다. 내가 페이지를 떠날 때마다,이 컨트롤은 파괴되지 않습니다. (나는 WebException을 볼 수 있습니다.) 그리고이 페이지를 다시 방문하면 다른 컨트롤이 만들어집니다. 10 회 방문한 후에 나는 10 개의 웹 예외를 볼 수 있습니다. 이건 이상해. 그래서이 물건들을 파괴하기 위해서 내가해야 할 일은 무엇일까요? 이 컨트롤은 아마 타이머 내부에 있으며 1 분마다 웹 주소를 호출합니다. – johnX99

답변

3

감사합니다 그 반대).

코드가 깨끗한 경우에도 누수가있는 외부에서 컨트롤을 사용하면 페이지가 누출 될 수 있습니다. 이 경우 OnNavigatingFrom()에서 트리에서 문제가되는 요소를 제거하여 영향을 완화 할 수 있습니다. 이렇게하면 전체 페이지가 아닌 해당 컨트롤 만 유출됩니다.

현재 광고 컨트롤이 해당 카테고리에 속합니다. 여기에 대한 지침이 있습니다 : http://msdn.microsoft.com/en-us/library/gg491975(v=msads.10).aspx

SL Toolkit의 ContextMenu에 대한 비슷한 이야기입니다. 사용하고있는 경우에 대비하십시오.

2

http://forums.create.msdn.com/forums/p/76007/466968.aspx에서의 토론은 내 앱에 매우 유용했습니다. 내가 &했다

것들 (위의 링크에서) 일 :

  • 모든 페이지에 대한 CompleteInitializePhoneApplication 방법에 App.xaml에 다음
#if DEBUG 
     ~MyPageView() 
     { 
      System.Windows.Deployment.Current.Dispatcher.BeginInvoke(new System.Action(() => 
      { 
       System.Windows.MessageBox.Show("MyPageView Destructing"); 
       // Seeing this message box assures that this page is being cleaned up 
      })); 
     } 
#endif 
  • 추가 (만 DEBUG를) 소멸자를 선언
 private void CompleteInitializePhoneApplication(object sender, NavigationEventArgs e) 
     { 
#if DEBUG 
      System.GC.Collect(); 
      System.GC.WaitForPendingFinalizers(); 
#endif 
      // Other usual stuff in this method 
     } 
  • 페이지에서 멀리
    protected override void OnNavigatedFrom(System.Windows.Navigation.NavigationEventArgs e) 
    { 
        base.OnNavigatedFrom(e); 
    
        // Clear the page datacontext 
        this.DataContext = null; 
        // Clear any other datacontexts esp if the life time of the databound objects are different. 
        MyDownloadProgressBar.DataContext = null; 
        // Make sure that if there are any references to elements scoped to this page's lifetime are being held by any other global objects, then they should be cleared here 
    } 
    

    내 응용 프로그램에서 메모리를 관리 할 수있는 더 많은 방법/도움말을 찾을으로

탐색에 지우기의 DataContext 년대, 나는이 대답을 업데이트하겠습니다.

+0

팁에 대한 업데이트가 있습니까? –

+0

아직 업데이트가 없습니다. 난 잠시 동안 WP 애플 리케이션에 대한 작업을하지 않았습니다. – moonlightdock

0

죄송합니다. 내 영어가 매우 나쁩니다. 어쨌든. 나는 같은 문제가있다. 나는 이렇게 풀었다.

protected override void OnBackKeyPress(System.ComponentModel.CancelEventArgs e) 
    { 
     base.OnBackKeyPress(e); 
     timer.Tick -= timer_Tick; 
     this.Loaded -= new RoutedEventHandler(timer_Tick); 
     AnaMenu.cli.GetAboutCompleted -= client_GetAboutCompleted; 
    } 

이벤트에 -=을 사용했습니다.수정했습니다.

관련 문제