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 함수를 조작하여?
미리 감사드립니다.
틱 이벤트가 시작될 때 타이머를 멈추고 마지막에 다시 시작하는 방법은 어떻습니까? –
위의 코드에 문제가 있다고 생각하지 않습니다. 내가 의심하는 다른 곳에서 범인. BTW는'WatchHour.Text = timeSpan1.Hours를 사용합니다.ToString ("00");'당신이 필요로하는 올바른 형식을 이루기 위해 –
앱을 실행 시키거나 어떤 시점에서 메모리가 더 이상 증가하지 않으면 앱이 충돌합니까? –