У меня есть приложение WPF, которое использует DispatcherTimer для обновления тика часов.
Однако после того, как мое приложение проработало около 6 часов, углы стрелок часов больше не меняются. Я убедился, что DispatcherTimer все еще работает с отладкой и что значения углов все еще обновляются, однако рендеринг экрана не отражает изменения.
Я также проверил с помощью инструментов 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 с пакетом обновления 1 (SP1) или Windows XP с пакетом обновления 3 (оба показывают одинаковое поведение)
EDIT: добавление функции тиканья часов
//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);