- c - 在位数组中找到第一个零
- linux - Unix 显示有关匹配两种模式之一的文件的信息
- 正则表达式替换多个文件
- linux - 隐藏来自 xtrace 的命令
我有一个 WPF 应用,它使用 DispatcherTimer 来更新时钟节拍。
但是,在我的应用程序运行大约 6 小时后,时钟指针的角度不再改变。我已验证 DispatcherTimer 仍在使用 Debug 触发,并且角度值仍在更新,但屏幕渲染并未反射(reflect)更改。
我还使用 WPFPerf 工具 Visual Profiler 验证了未标记时间、Tick(时间管理器)和 AnimatedRenderMessageHandler(媒体内容)都在逐渐增长,直到它们消耗了将近 80% 的 CPU,但是内存运行稳定。
hHandRT.Angle 是对 RotateTransform 的引用
hHandRT = new RotateTransform(_hAngle);
此代码在大约 5 小时的直线运行中完美运行,但之后它会延迟并且角度变化不会呈现到屏幕上。有关如何解决此问题的任何建议或您可能知道的任何可能的解决方案。
.NET 3.5、Windows Vista SP1 或 Windows XP SP3(两者表现出相同的行为)
编辑:添加时钟滴答功能
//In Constructor
...
_dt = new DispatcherTimer();
_dt.Interval = new TimeSpan(0, 0, 1);
_dt.Tick += new EventHandler(Clock_Tick);
...
private void Clock_Tick(object sender, EventArgs e)
{
DateTime startTime = DateTime.UtcNow;
TimeZoneInfo tst = TimeZoneInfo.FindSystemTimeZoneById(_timeZoneId);
_now = TimeZoneInfo.ConvertTime(startTime, TimeZoneInfo.Utc, tst);
int hoursInMinutes = _now.Hour * 60 + _now.Minute;
int minutesInSeconds = _now.Minute * 60 + _now.Second;
_hAngle = (double)hoursInMinutes * 360 / 720;
_mAngle = (double)minutesInSeconds * 360 / 3600;
_sAngle = (double)_now.Second * 360 / 60;
// Use _sAngle to showcase more movement during Testing.
//hHandRT.Angle = _sAngle;
hHandRT.Angle = _hAngle;
mHandRT.Angle = _mAngle;
sHandRT.Angle = _sAngle;
//DSEffect
// Add Shadows to Hands creating a UNIFORM light
//hands.Effect = textDropShadow;
}
按照时钟滴答中发生太多事情的思路,我目前正在尝试进行此调整以查看是否有帮助。太糟糕了,这个错误需要 5 个小时才能显现出来:(
//DateTime startTime = DateTime.UtcNow;
//TimeZoneInfo tst = TimeZoneInfo.FindSystemTimeZoneById(_timeZoneId);
//_now = TimeZoneInfo.ConvertTime(startTime, TimeZoneInfo.Utc, tst);
_now = _now.AddSeconds(1);
最佳答案
你说你每次都在创建 Clock 类的实例?请注意,.NET 中的计时器将自己 Root 以防止自己被垃圾收集。它们会一直发射,直到您自己停止它们,并且它们会使您的 Clock 对象保持事件状态,因为它们在计时器滴答事件中被引用。
我认为正在发生的事情是,您创建的每个时钟都会启动另一个计时器。起初你每秒只触发 1 个事件,但随后你添加了另一个计时器并每秒触发 2 个事件,它们继续以这种方式累积。最终您会看到您的 Tick 处理程序和 AnimatedRenderMessageHandler 在 CPU 中不断上升,直到它们停滞不前并且无法更新您的屏幕。这也可以解释为什么增加计时器触发的频率会使您的症状出现得更快。
修复应该很简单:当您使用完 Clock 对象时,只需停止或释放 DispatcherTimer。
关于c# - 随着时间的推移,DispatcherTimer 会占用 CPU,导致 WPF 视觉对象无法正确呈现,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/1548479/
我是一名优秀的程序员,十分优秀!