我目前正在编写一个主要使用DispatcherTimer来模拟秒表功能的应用。当我的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默认情况下缓存了以前的内容,加上由于秒表功能导致的文本快速更改,但是,在从我的应用程序中完全删除TextBox并进行分析后,我很确定它们不是这个问题。如上所述,在此TimerTick处理程序的末尾添加GC.Collect()没有做任何事情来减少我的内存使用量。有没有人知道如何通过DispatcherTimer减少我的内存使用量,可能通过某种方式操纵GC功能实际工作?
提前致谢!
答案 0 :(得分:0)
为什么要在计时器刻度事件之外声明timespan1和timespan2?如果在事件处理程序
中创建内存,内存是否会更好答案 1 :(得分:0)
您能否请尝试以下代码段
步骤: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();
}
}
希望它适合你。
让我知道你的反馈意见。
答案 2 :(得分:0)
我终于隔离了内存泄漏的核心,问题不在于我的DispatcherTimer,而在于我的AdRotator控件。 AdRotator开发人员已经发现问题,我目前正在使用不同的广告控制,直到问题得到解决。
谢谢大家的帮助,我非常感谢您的时间和精力!