编辑:如果有用,此项目位于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
答案 0 :(得分:0)
如果没有看到剩下的代码或计时器属于的类,这有点难以辨别。我没有看到你在计时器上调用Stop()的任何地方。是否需要停止?
您也可以在您所在的任何课程中保留对计时器的本地引用,并根据需要调用Start()和Stop()。
如果计时器永远不需要停止并且无限期地运行,我肯定会看看你在计时器运行时分配的内容,这可能就是你的问题所在。