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函数来实际工作?

提前感谢!

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

为什么在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开发人员已经发现了这个问题,在问题解决之前,我目前正在使用不同的广告控件。

谢谢大家的帮助,我真的很感谢你们的时间和努力!