DispatcherTimer不断增加内存使用量,直到应用程序崩溃

时间:2013-08-25 18:58:53

标签: c# memory-leaks windows-phone-8 garbage-collection dispatchertimer

我目前正在编写一个主要使用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功能实际工作?

提前致谢!

3 个答案:

答案 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开发人员已经发现问题,我目前正在使用不同的广告控制,直到问题得到解决。

谢谢大家的帮助,我非常感谢您的时间和精力!