DispatcherTimer を使用して時計の目盛りを更新する WPF アプリがあります。
ただし、アプリケーションを約 6 時間実行した後、時計の針の角度が変化しなくなりました。DispatcherTimer が Debug で引き続き起動し、角度値が更新されていることを確認しましたが、画面のレンダリングには変更が反映されません。
また、WPPFerf ツールの Visual Profiler を使用して、Unlabeled Time、Tick (Time Manager)、および AnimatedRenderMessageHandler(Media Content) がすべて CPU のほぼ 80% を消費するまで徐々に増加していることを確認しましたが、メモリは安定して動作しています。
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);