Ho un'app WPF che utilizza DispatcherTimer per aggiornare un segno di spunta dell'orologio.DispatcherTimer che consuma CPU nel tempo causando il rendering non corretto del visual WPF
Tuttavia, dopo che la mia applicazione è stata in funzione per circa 6 ore, gli angoli delle lancette dell'orologio non cambiano più. Ho verificato che DispatcherTimer stia ancora funzionando con Debug e che i valori dell'angolo siano ancora in fase di aggiornamento, tuttavia il rendering della schermata non riflette la modifica.
Ho anche verificato utilizzando gli strumenti WPFPerf Visual Profiler che il Tempo non contrassegnato, Tick (Time Manager) e AnimatedRenderMessageHandler (Contenuto multimediale) stanno gradualmente crescendo fino a quando non consumano quasi l'80% della CPU, tuttavia la memoria è stabile.
Il hHandRT.Angle è un riferimento ad un RotateTransform
hHandRT = new RotateTransform(_hAngle);
Questo codice funziona perfettamente per circa 5 ore di marcia in rettilineo, ma dopo che ritardi e la variazione dell'angolo non rende allo schermo. Qualche suggerimento su come risolvere questo problema o eventuali soluzioni che potresti conoscere.
.NET 3.5, Windows Vista SP1 o Windows XP SP3 (entrambi mostrano lo stesso comportamento)
EDIT: Aggiunta di Clock Tick Funzione
//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;
}
Lungo le linee di troppo accadendo nel clock tick, attualmente sto provando questo aggiustamento per vedere se aiuta. Peccato ci vogliono 5 ore per il bug di manifestarsi :(
//DateTime startTime = DateTime.UtcNow;
//TimeZoneInfo tst = TimeZoneInfo.FindSystemTimeZoneById(_timeZoneId);
//_now = TimeZoneInfo.ConvertTime(startTime, TimeZoneInfo.Utc, tst);
_now = _now.AddSeconds(1);
Non conosco la risposta, ma questo è un problema curioso. Non vedo l'ora di vedere alcune risposte. –
Con quale frequenza spunta il timer del dispatcher? –
@Greg Ho aggiunto anche quella parte. Si aggiorna ogni secondo. – discorax