Bei einer C# Applikation tritt nach einer bestimmten Zeit ein Fehler
auf. Der Wert ticks ist negative. Warum kann die Variable ticks negativ
werden? Wahrscheinlich handelt es sich hierbei um einen Überlauf. Wie
könnte man sowas ändern, damit solch eine Meldung nicht mehr erscheint?
csharpuser schrieb:> Warum kann die Variable ticks negativ> werden?
keine Ahnung, gibt doch mal die werte aus.
ticks = ticks + (long)DiffTime;
auch bei einen Long ist irgendwann mal schluss.
und was sagt denn die exception aus
Hab ausversehen den Screnshot von der Fehlermeldung (Visual Studio)
gelöscht. Was könnte getan werden, wenn der Fehler nochmals auftreten
sollte? Mit try und catch fange ich den Fehler ab. Ist das der richtige
Weg?
csharpuser schrieb:> Was könnte getan werden, wenn der Fehler nochmals auftreten> sollte?
den Fehler beheben, wenn der wert überläuft ist halt die Variabel zu
klein.
> Mit try und catch fange ich den Fehler ab. Ist das der richtige> Weg?
wenn du das Ergebnis nicht brauchst, kann man das schon machen.
Arc Net schrieb:> Sven B. schrieb:>> long ticks = datetime.Ticks << hier ist der Fehler>>>> Ticks ist ein QUAD !>>>> mach mal>>>> int64 ticks = datetime.Ticks>>>> siehe MSDN>> Genau...> https://msdn.microsoft.com/de-de/library/system.datetime.ticks%28v=vs.110%29.aspx>> public long Ticks { get; }>> Ansonsten hätte der Compiler einen Fehler geworfen und auf einen> nötigen, expliziten Cast hingewiesen...
Auf der MS-Seite steht expilzit: Typ: System.Int64
Bin vor kurzen selber über das Problem gestolpert, dass ich Ticks als
long definiert und unsinnige Ergebnisse erhalten hatte.
Was gibt _myQueryPerfCounter.Duration eigentlich zurück (Typ und
Einheit)? Hast du diesen Wert und ticks im Fehlerfall geloggt oder dir
zumindest mal im Debugger angeschaut?
csharpuser schrieb:> Was könnte getan werden, wenn der Fehler nochmals auftreten> sollte? Mit try und catch fange ich den Fehler ab. Ist das der richtige> Weg?
Das Problem scheint ja inzwischen behoben zu sein. Generell würde ich
bei solchen nur gelegentlich auftauchenden Problemen folgendermaßen
vorgehen:
* try/catch ist schon mal gut, dann muss dein Programm nicht abstürzen.
* Die Exception komplett, mit Stacktrace ausgeben oder besser in ein
Logfile schreiben.
Wenn dein Programm etwas größer ist würde ich überlegen ein
Logging-Framework, z.B. Log4net, einzusetzen. Dann kannst du die
Debug-Ausgaben im Code drinlassen, auch wenn du später weniger oder fast
gar nichts mehr ausgeben willst.
csharpuser schrieb:> Wie schreibe ich einen Stacktrace in eine Textdatei?
Datei öffnen
stracktrace reinschreiben
Datei schließen.
Das hilft dir aber für dein Problem nicht weiter. Du musst dir einfach
überlegen wie es dazu kommen kann das Ticks einen ungültigen
Wertebereich annimmt. Dann baust du extra Prüfungen in deinen code ein
um zu ermitteln wo es zu diesen Problem kommt.
@csharpuser:
Das Hauptproblem ist, dass Du irgendwelche Codeschnipsel postest, denen
wesentliche Informationen fehlen: Die Typen der Variable und Felder.
Du schreibst, dass Du eine Exception bekommst, weil ticks negativ ist.
Das kann nur in der Zeile
1
ticks=ticks+(long)DiffTime;
zum Problem werden. Es würde sich mir die Frage aufdrängen, wieso Ticks
negativ ist? Möglicherweise weil die Argumente in der Zeile
vertauscht sind? Das ist aber nur eine Vermutung. Mehr Infos gibt's mit
Sicherheit in der API-Doku. Dazu müsste man aber vor allem die
beteiligten Typen kennen. Vielleicht postet Du mal etwas mehr Code...
Grüße
Markus
was hast du für eine CPU?
Es gibt bei AMD das Problem das jeder Kern seine eigenen Counter hat.
Das kann dazu führen das nach einen Taskwechsel das Ende vor den Start
ist. Dafür gibt es von ADM ein tool was das verhindert.
Oder du musst dafür sorgen, das du nur auf einen Kern läufst.
So auf den ersten Blick sieht das zwar etwas wirr, aber soweit ok aus.
Bist Du sicher, dass die Handler OnTimer und Callback in der richtigen
Reihenfolge aufgerufen werden? Das ist, so wie ich es sehe, die einzige
Möglichkeit, dass die Tick-Differenz negativ wird.
Grüße
Markus
Was vielleicht helfen würde: Speichere Start und Stop als Felder der
Klasse MyQueryPerfcounter zu speichern und dann beim Aufruf von Duration
diese zu verwenden. Das wäre ein wesentlich besseres Design.
Grüße
Markus
Was könnte man tun, damit wenn die Callback Methode vor der OnTimer
ausgeführt wird?
In der OnTimer wird zyklisch eine Methode gestartet. In der Callback
Methode wird dann reingesprungen.
csharpuser schrieb:> Korrektur: Intel Core i7 CPU (Windows7 64Bit)
ok, das sollte das Problem nicht auftreten.
Bau mal in der funktion Duration eine Prüfung ein, die eine exception
wirft, wenn start > stop ist.
Bei welcher Gelegenheit wird eigentlich die Methode Callback aufgerufen?
Mit welchen Parametern? Wo wird die Callback-Methode als Event-Handler
registriert?
Ich bin der festen Überzeugung, dass Du ein Nebenläufigkeitsproblem
hast. Soll heißen, der Callback-Handler wird in einem anderen Thread als
OnTimer aufgerufen. Dabei kann es dann dazu kommen, dass das nächste
OnTimer vor dem letzten Callback-Aufruf kommt. Deshalb musst Du
geeignete Maßnahmen ergreifen, damit die Zeitmessung (?) mit den
richtigen Werten arbeitet.
Grüße
Markus
Guten Morgen,
ich vermute auch, dass ich eventuell ein Nebenläufigkeitsproblem habe.
In der OnTimer Funktion wird jede Sekunde ein Ping gesendet mit der
Methode SendAsync. In der Callback Methode PingCompletedCallback werden
die Antworten empfangen bzw. wird ausgeführt wenn ein Timeout
aufschlägt.
Die OnTimer Methode wird mit, sie unten, angelegt bzw. erzeugt.
Hab ich bereits in der Duration Methode gemacht. Allerdings muss die
Prüfung start > stop sein.
[c]
if (start > stop)
{
Console.WriteLine("Timestamp: " + DateTime.Now.ToString() + " start: "
+ start.ToString() + " stop: " + stop.ToString());
}
Das Programm lief nun ca. 15 Stunden ohne Probleme durch. Visual Studio
erzeugte keine Fehlermeldung.