Hallo,
In een applicatie loop ik tegen een vreemd probleem aan. De applicatie heeft een loop (timer) waarin elke 30 seconden de huidige instellingen worden gecontroleerd en indien nodig worden bijgesteld. Echter na verloop van tijd, tot nu toe altijd pas na één of meer dagen, ontstaat er een “knipperende” instellingswaarde.
Na het afsluiten en opnieuw opstarten van de applicatie loop alles weer zoals gewenst.
In de code heb ik een singleton controller met daarin de huidige instellingen en een timer. De klasse met instellingen heeft een int? als Id, deze is volgens de documentatie _niet_ thread safe.
Na verloop van tijd zie ik helaas “geknipper” bij het schrijven van de instellingen: elke 30 sec zie ik de waarde wisselen (om en om) tussen 0 en X, waarbij X de ingestelde waarde is. De instelling zelf is niet veranderd en dat vind ik dus het vreemde.
Nu heb ik zelf de 0 hard als default value staan, maar in elapsed event zouden de CurrentSettings en CurrentSettings.Id gezet moeten zijn. Dat zijn nu nog de enige twee punten waar ik geen log-traces heb staan, die komen in de eerst volgende versie, dus ik weet niet welke van de twee vergelijkingen onwaar oplevert.
Er is geen tweede instantie van de singleton die op de achtergrond ligt de irriteren. Dit heb ik gecontroleerd door een log-entry te maken bij het instantieren van de controller.
Wat ik wel zie is dat de elapsed event van de timer(soms) 2x wordt getriggerd, zo’n 500ms achter elkaar. Maar dat is maar heel sporadisch.
De CurrentSettings worden eenmalig gezet en inhoudelijk niet veranderd. Wel kunnen er andere settings worden geselecteerd, mogelijk met Id=null (default settings).
Nu ben ik het spoor bijster en weet niet waar het probleem vandaan kan komen. Het vreemde vind ik het geknipper, zonder iets te doen wisselt de instellingswaarde. Maar als in de vergelijking de waarde hard op 0 zet (laat staan), door het niet kunnen opvragen de Id, is het de volgende event weer goed.
Heeft iemand een handvat of een verwijzing waar ik de oorzaak van dit probleem kan achterhalen?
In een applicatie loop ik tegen een vreemd probleem aan. De applicatie heeft een loop (timer) waarin elke 30 seconden de huidige instellingen worden gecontroleerd en indien nodig worden bijgesteld. Echter na verloop van tijd, tot nu toe altijd pas na één of meer dagen, ontstaat er een “knipperende” instellingswaarde.
Na het afsluiten en opnieuw opstarten van de applicatie loop alles weer zoals gewenst.
In de code heb ik een singleton controller met daarin de huidige instellingen en een timer. De klasse met instellingen heeft een int? als Id, deze is volgens de documentatie _niet_ thread safe.
C#:
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
| class Settings { public int? Id {get; set;} ... } public class Controller { private static volatile Controller mInstance; private static object mSync = new Object(); private System.Timers.Timer mTimer; private Controller() { mTimer = new Timer… } public static Controller Instance { get { lock (mSync) { if (mInstance == null) { mInstance = new Controller (); } } return mInstance; } } public Settings CurrentSettings {get; set;} ... void mTimer_Elapsed(object sender, ElapsedEventArgs e) { int lValue = 0; if (CurrentSettings != null) { if (CurrentSettings.Id.HasValue) { lValue = CurrentSettings.Id.Value; } } // write lValue } } |
Na verloop van tijd zie ik helaas “geknipper” bij het schrijven van de instellingen: elke 30 sec zie ik de waarde wisselen (om en om) tussen 0 en X, waarbij X de ingestelde waarde is. De instelling zelf is niet veranderd en dat vind ik dus het vreemde.
Nu heb ik zelf de 0 hard als default value staan, maar in elapsed event zouden de CurrentSettings en CurrentSettings.Id gezet moeten zijn. Dat zijn nu nog de enige twee punten waar ik geen log-traces heb staan, die komen in de eerst volgende versie, dus ik weet niet welke van de twee vergelijkingen onwaar oplevert.
Er is geen tweede instantie van de singleton die op de achtergrond ligt de irriteren. Dit heb ik gecontroleerd door een log-entry te maken bij het instantieren van de controller.
Wat ik wel zie is dat de elapsed event van de timer(soms) 2x wordt getriggerd, zo’n 500ms achter elkaar. Maar dat is maar heel sporadisch.
De CurrentSettings worden eenmalig gezet en inhoudelijk niet veranderd. Wel kunnen er andere settings worden geselecteerd, mogelijk met Id=null (default settings).
Nu ben ik het spoor bijster en weet niet waar het probleem vandaan kan komen. Het vreemde vind ik het geknipper, zonder iets te doen wisselt de instellingswaarde. Maar als in de vergelijking de waarde hard op 0 zet (laat staan), door het niet kunnen opvragen de Id, is het de volgende event weer goed.
Heeft iemand een handvat of een verwijzing waar ik de oorzaak van dit probleem kan achterhalen?