1

我目前正在编写一个应用程序,主要使用 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 构造函数,事件处理程序中存在的文本框显示从启动秒表经过的时间。我在这里做了什么特别错误的事情导致内存如此巨大的增加吗?我以前认为这个问题是因为默认情况下 TextBox 会以某种方式缓存它们以前的内容,再加上由于秒表功能而导致的文本快速变化,但是,在从我的应用程序中完全删除 TextBox 并对其进行分析之后,我很确定它们是不是问题。如上所述,在 TimerTick 处理程序的末尾添加 GC.Collect() 并没有减少我的内存使用量。有没有人知道我可以如何使用 DispatcherTimer 减少内存使用量,也许是通过某种方式操纵 GC 函数来实际工作?

提前致谢!

4

3 回答 3

0

我终于隔离了内存泄漏的核心,问题不在于我的 DispatcherTimer,而在于我的 AdRotator Control。AdRotator 开发人员已经发现了这个问题,我目前正在使用不同的 Ad 控件,直到问题得到解决。

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

于 2013-08-26T12:53:12.113 回答
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();
        }
    }

希望对你有效。

让我知道您的反馈。

于 2013-08-26T06:08:05.520 回答
0

为什么要在计时器滴答事件之外声明时间跨度 1 和时间跨度 2?如果在事件处理程序中创建内存,它看起来会更好吗

于 2013-08-25T19:21:55.643 回答