WPF DispatcherTimer内存问题

时间:2016-01-29 19:38:07

标签: c# wpf timer

编辑:如果有用,此项目位于https://github.com/lostchopstik/BetterBlync

的GitHub上

我正在使用他们提供的API构建Blync状态指示灯的应用程序。此应用程序轮询Lync / Skype for Biz客户端并将状态转换为适当的浅色。到目前为止,所有方面都按预期工作,但是当我让这个程序长时间运行时,内存使用量会增加,直到发生System.OutOfMemory异常。

我已将问题缩小到DispatcherTimer,将计时器保留在内存中并防止它被GCed。在线阅读了一些内容后,我发现你可以手动调用垃圾回收,但这是不好的做法。无论如何,这就是我现在在代码中的内容:

private void initTimer()
    {
        timer = new DispatcherTimer();
        timer.Interval = new TimeSpan( 0, 0, 0, 0, 200 );
        timer.Tick += new EventHandler( Timer_Tick );
        timer.Start();
    }

private void Timer_Tick(object sender, EventArgs e)
    {
        // Check to see if any new lights are connected
        blync.FindBlyncLights();

        // Get current status from Lync client
        lync.GetStatus();

        // Change to new color
        setStatusLight();

        if ( count++ == 100 )
        {
            count = 0;
            GC.Collect();
        }
    }

计时器每200ms计时一次。我在计时器中注释掉了所有方法,只让它运行为空,它仍然会烧掉内存。

我想知道处理这个计时器的正确方法是什么。我过去使用过DispatcherTimer而没有遇到过这个问题。

我也愿意尝试除DispatcherTimer之外的其他东西。

如果它也有用,我一直在搞乱MemProfiler,这里是我手册GC的当前图表: http://imgur.com/Iut91mF memory graph

1 个答案:

答案 0 :(得分:0)

如果没有看到剩下的代码或计时器属于的类,这有点难以辨别。我没有看到你在计时器上调用Stop()的任何地方。是否需要停止?

您也可以在您所在的任何课程中保留对计时器的本地引用,并根据需要调用Start()和Stop()。

如果计时器永远不需要停止并且无限期地运行,我肯定会看看你在计时器运行时分配的内容,这可能就是你的问题所在。