У меня есть приложение WPF, которое использует DispatcherTimer для обновления отметки времени.
Однако после того, как мое приложение проработало около 6 часов, углы стрелок часов больше не меняются. Я проверил, что DispatcherTimer все еще запускается с Debug и что значения углов все еще обновляются, однако экранная визуализация не отражает изменения.
Я также проверил с помощью инструментов WPFPerf Visual Profiler, что Unlabeled Time, Tick (Time Manager) и AnimatedRenderMessageHandler (Media Content) все постепенно растут, пока они не потребляют почти 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);