1

DispatcherTimer를 주로 사용하여 스톱워치 기능을 에뮬레이트하는 앱을 작성하고 있습니다. 내 DispatcherTimer가 앱 내에서 실행되는 동안 내 앱의 메모리 사용량은 10 분이내로 100MB까지 올라갑니다. 이는 앱의 기능이 얼마나 단순한지를 고려하면 특히 이상합니다. 이것은 일반적으로 응용 프로그램의 메모리 사용량이 급격히 증가하여 충돌 및 종료되는 것을 제외하고는 일반적으로 문제가되지 않았습니다. DispatcherTimer 메모리 누수가 있음을 인정하는 기사를 여러 번 보았습니다.하지만이 메모리 누수에 대한 모든 수정 사항은 DispatcherTimer가 더 이상 필요하지 않을 때 중지됩니다. 내 메모리 누수가 DispatcherTimer가 여전히 필요하지만 실수로 실행 된 상태가 아닌 경우에 발생합니다. 나는 사용자가 원하는 시간 동안 스톱워치를 계속 작동시킬 수 있도록해야하므로 DispatcherTimer가 더 이상 필요하지 않을 때 중지하면 많은 도움이되지 않습니다. 그러나 TimerTick 이벤트 처리기 끝에 GC.Collect()를 추가하려고 시도했지만 그 중 많은 것을 수행하지는 않았습니다.DispatcherTimer는 앱이 다운 될 때까지 메모리 사용량을 계속 증가시킵니다.

public MainPage() 
    { 
     InitializeComponent(); 
     PhoneApplicationService.Current.ApplicationIdleDetectionMode = IdleDetectionMode.Disabled; 
     Timer.Stop(); 
     Timer.Interval = new TimeSpan(0, 0, 1); 
     Timer.Tick += new EventHandler(TimerTick); 
     Loaded += new System.Windows.RoutedEventHandler(MainPage_Loaded);   

    } 

void TimerTick(object sender, EventArgs e) 
    { 

     timeSpan1 = DateTime.Now.Subtract(StartTimer); 
     timeSpan2 = DateTime.Now.Subtract(StartTimer2); 
     WatchHour.Text = timeSpan1.Hours.ToString(); 
     WatchMinute.Text = timeSpan1.Minutes.ToString(); 
     WatchSecond.Text = timeSpan1.Seconds.ToString(); 
     SecondaryHour.Text = timeSpan2.Hours.ToString(); 
     SecondaryMinute.Text = timeSpan2.Minutes.ToString(); 
     SecondarySecond.Text = timeSpan2.Seconds.ToString(); 


     if (WatchHour.Text.Length == 1) WatchHour.Text = "0" + WatchHour.Text; 
     if (WatchMinute.Text.Length == 1) WatchMinute.Text = "0" + WatchMinute.Text; 
     if (WatchSecond.Text.Length == 1) WatchSecond.Text = "0" + WatchSecond.Text; 


     if (SecondaryHour.Text.Length == 1) SecondaryHour.Text = "0" + SecondaryHour.Text; 
     if (SecondaryMinute.Text.Length == 1) SecondaryMinute.Text = "0" + SecondaryMinute.Text; 
     if (SecondarySecond.Text.Length == 1) SecondarySecond.Text = "0" + SecondarySecond.Text; 

    } 

이 내 TimerTick 이벤트 핸들러 내 MainPage 생성자의 비트이며, 이벤트 핸들러에 존재하는 텍스트 박스 스톱워치를 시작으로부터 경과 된 시간을 표시. 이렇게 엄청난 메모리 증가를 일으키는 특별히 잘못된 것을하고 있습니까? 이전에 TextBoxes가 기본적으로 스톱워치 기능으로 인해 텍스트의 급격한 변화와 결합하여 이전 콘텐츠를 캐싱했기 때문에 문제가 발생한 것으로 생각했지만 응용 프로그램에서 TextBoxes를 완전히 제거하고 분석 한 후에는 별표가 표시되지 않습니다. 문제가 아닙니다. 위에서 언급 한 것처럼이 TimerTick 핸들러의 끝 부분에 GC.Collect()를 추가해도 메모리 사용량이 감소하지 않았습니다. 아무도 어떻게 DispatcherTimer 내 메모리 사용량을 줄일 수있는 아이디어를 가지고, 어쩌면 실제로 작동하도록 GC 함수를 조작하여?

미리 감사드립니다.

+0

틱 이벤트가 시작될 때 타이머를 멈추고 마지막에 다시 시작하는 방법은 어떻습니까? –

+1

위의 코드에 문제가 있다고 생각하지 않습니다. 내가 의심하는 다른 곳에서 범인. BTW는'WatchHour.Text = timeSpan1.Hours를 사용합니다.ToString ("00");'당신이 필요로하는 올바른 형식을 이루기 위해 –

+0

앱을 실행 시키거나 어떤 시점에서 메모리가 더 이상 증가하지 않으면 앱이 충돌합니까? –

답변

0

마침내 내 메모리 누수의 핵심을 분리했습니다. 문제는 DispatcherTimer가 아닌 AdRotator 컨트롤과 관련이 있습니다. 문제는 AdRotator 개발자 측에서 확인되었으며 현재 문제가 해결 될 때까지 다른 광고 컨트롤을 사용하고 있습니다.

도움을 주셔서 감사합니다. 시간과 노력에 진심으로 감사드립니다.

+0

이 질문을 답변으로 표시하려고 시도하십시오 ... –

+0

내 대답을 내 대답으로 표시하려면 2 시간 정도 기다려야한다고합니다. S – user2637236

0

왜 타이머 틱 이벤트 외부에서 timespan1 및 timespan2를 선언하고 있습니까? 1 먼저 XAML에서 버튼과 TextBlock을 추가 : 이벤트 핸들러 다음과 같은 코드를 시도하십시오 수

+0

메모리 사용량과 비슷합니다 그러나, 당신은 내 코드를 약간 단순화하는 데 도움이되었습니다! – user2637236

0

의 내부를 만들 경우 메모리는

단계 더 잘 보입니까.

단계 : 2 를 사용하여 다음과 같은 네임 스페이스 :

using System.Diagnostics; // for Stopwatch API Access 

단계 : 3을 사용하여 아래에 언급 된 코드 :

public partial class WmDevStopWatch : PhoneApplicationPage 
    { 
     Stopwatch stopWatch = new Stopwatch(); 
     DispatcherTimer oTimer = new DispatcherTimer(); 

     public WmDevStopWatch() 
     { 
      InitializeComponent(); 

      oTimer.Interval = new TimeSpan(0, 0, 0, 0, 1); 
      oTimer.Tick += new EventHandler(TimerTick); 

     } 

     void TimerTick(object sender, EventArgs e) 
     { 
      Dispatcher.BeginInvoke(() => 
      { 
       string elapsedTime = String.Format("{0:00}:{1:00}:{2:00}.{3:00}", 
        stopWatch.Elapsed.Hours, stopWatch.Elapsed.Minutes, stopWatch.Elapsed.Seconds, 
        stopWatch.Elapsed.Milliseconds/10); 

       textBlock1.Text = elapsedTime; 
      }); 
     } 


     private void button1_Click(object sender, RoutedEventArgs e) 
     { 
      stopWatch.Start(); 
      oTimer.Start(); 
     } 
    } 

이 당신을 위해 작동 바랍니다.

동일한 의견을 보내주십시오.

관련 문제