【发布时间】:2021-08-31 13:27:02
【问题描述】:
我最近制作了一个桌面应用程序,可以与我工作的设备进行通信。
该应用程序的总体思路是给设备(烤箱)一个“设置温度”命令,每 10 秒检查一次当前温度并使用实时图表将其显示在图表上。
此应用程序需要一次运行多天,我认为我似乎遇到了内存泄漏问题。 我的经验是应用程序有一段时间没有响应,然后它变得响应并添加 1 个单个“日志”效果,就像在 LogTemp 函数中一样,大约每 1-2 分钟。应该是每 10 秒一次。
编辑:刚刚阅读此编辑之前的行,我想我不太清楚。它可以正常工作,因为它应该在最初的几个小时内工作。注意到性能仅在 24 小时后才受到打击。
运行 24 小时后,我发现它正在使用超过 800 MB 的 RAM,而且它还在以秒为单位增长。
我怀疑它可能与livecharts 有关,但我不确定。 (24小时后得到8640个数据点)
我没有任何问题披露我的代码,甚至将需要显示的代码量减少到总共大约 200 行,这些代码分为几个不同的功能,但是如果有人听说过实时图表和/或这样的问题可以建议不同类型的图形库,我很乐意将其换掉。
Actually, here's the code, lmao:
我想到的另一件事,可能是我向 ListView 添加了太多行吗?我们正在谈论.. 24 小时内 8640 行。可能和它有关吗?
抱歉发了这么长的帖子,先谢谢了。
【问题讨论】:
-
您是否尝试过在 Visual Studio 诊断会话下长时间运行它,跟踪内存使用情况?您从中获得的报告可能有助于确定泄漏源。只需转到 调试 >> 性能分析器。
-
这个问题只在几个小时后才出现(我不确定,但我怀疑不到 10-15 小时)而且我没有在此期间更新的集合/绑定恒定循环。发布的代码(不包括我提到的两个函数,但没有发布 SetTemp 和 GetTemp)是唯一运行的代码(在单独的线程上),直到循环完成。我在周期结束之前发现了这个问题。 GUI 本身仅在使用 ListView 和 LiveCharts 图表显示的代码中进行更新。
-
@Joe 我一定会运行它并返回更多信息。谢谢。
-
这是做什么的? “Database.AddTemperature”我假设您没有保持数据库连接打开等,并且在您的 Db 代码中正确处理表、命令等。
-
离题 - 与您的内存泄漏无关,但为什么不使用 timer 而不是 while 循环和线程休眠。这将大大简化代码。
标签: c# wpf livecharts