DispatcherTimer不断增加内存使用量,直到应用程序崩溃
本文关键字:应用程序 崩溃 不断增加 内存 使用量 DispatcherTimer | 更新日期: 2023-09-27 18:28:54
我目前正在编写一个应用程序,该应用程序主要利用DispatcherTimer来模拟Stopwatch功能。当我的DispatcherTimer在应用程序中运行时,我的应用程序的内存使用量在不到10分钟的时间内就达到了100MB,考虑到应用程序的功能是多么简单,这尤其奇怪。这通常不会是一个问题,除非应用程序内存使用量的快速增加会导致它崩溃并关闭。我浏览了整个网络,并多次看到承认存在DispatcherTimer内存泄漏的文章,然而,对该内存泄漏的所有修复都包括在不再需要DispatcherTimer时停止它。我的内存泄漏发生在仍然需要DispatcherTimer的时候,而不是意外地让它运行的时候。我需要允许用户保持他们的秒表运行,无论他们选择多长时间,所以在不再需要DispatcherTimer时停止它对我没有多大帮助。我曾尝试在TimerTick事件处理程序的末尾添加GC.Collect(),但这似乎也没有多大作用。
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函数来实际工作?
提前感谢!
为什么在timer-tick事件之外声明timespan1和timespan2?如果在事件处理程序
你能试一下下面的代码片段吗,
步骤:1首先在xaml中添加按钮和文本块。
步骤: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();
}
}
希望它对你有用。
让我知道你的反馈。
我终于隔离了内存泄漏的核心,问题不是我的DispatcherTimer,而是我的AdRotator Control。AdRotator开发人员已经发现了这个问题,在问题解决之前,我目前正在使用不同的广告控件。
谢谢大家的帮助,我真的很感谢你们的时间和努力!