2012-05-28 14 views
7

Ich verwende derzeit den System.Threading.Timer in einem 10-Sekunden-Intervall. Ich habe jedes Mal, wenn der Timer ausgelöst wird, ein kleines Stück Code hinzugefügt, um in eine Datei zu schreiben, und während die meiste Zeit pünktlich feuert, manchmal (vermutlich, wenn der Rest der App gekauft wird), kann 30 nicht ausgelöst werden oder 40 Sekunden und feuert immer wieder in schneller Folge.Timer zuverlässiger als System.Threading.Timer

Gibt es einen zuverlässigeren Timer, den ich in .NET 3.5 verwenden kann?

Der Timer ist wie folgt aufgebaut

Timer someTimer = new Timer(new TimerCallback(SomeMethod), null, 0, 10000); 

... und der Rückruf ist:

private static void SomeMethod(object state) 

Allerdings ist es schwierig, viel mehr Code als dies zur Verfügung zu stellen, wie es normalerweise der Timer feuert richtig . Wenn es in eine massive Anwendung eingebettet ist (etwa 100.000 Zeilen), wobei mehrere Threads abgefeuert werden, links, rechts und in der Mitte, beginnen Sie langsam zu sehen, wie der Timer intermittierend ausgelöst wird. Ich habe mehrere Beiträge gesehen, die darauf hindeuten, dass der ThreadPool möglicherweise erschöpft ist. Daher schaue ich gerade nach, ob dies der Fall sein könnte.

+5

Können Sie einen Beispielcode angeben, anstatt * anzunehmen * der Timer ist unzuverlässig? Ich tendiere dazu, meinen eigenen Code zu finden, der das Problem und nicht die .NET Frameworks ist. –

+0

Der Timer ist wie folgt eingerichtet: – JamesPD

+0

ThreadPool-Verhungern wird sehr wahrscheinlich der Fall sein, wenn die Verarbeitung des Ticks länger als 10 Sekunden dauert. Sie werden langsam einen Rückstand von Gegenständen bekommen. Die Standardtaktik besteht darin, den Timer beim Eintritt in ein Tick-Ereignis zu stoppen und am Ende erneut zu starten, um aufgrund langer Verarbeitungszeiten kein "Timer-Leck" zu haben. –

Antwort

3

Das klingt genau wie Thread Pool Hunger. Achten Sie auf lange laufende/blockierende Jobs, die im Thread-Pool ausgeführt werden, und schreiben Sie sie entweder mit async io neu oder führen Sie diese Jobs im Falle von lang laufenden CPU-intensiven Jobs einfach nicht im Thread-Pool aus. Führen Sie sie in ihrem eigenen Thread aus oder verwenden Sie einen Hintergrund-Worker.

+0

Ich hatte gehofft, dass es nur ein Problem für System.Threading.Timer sein könnte und dass ich durch Umstellen auf einen anderen Timer das Problem umgehen könnte. Nach deinen Hinweisen und mit etwas genauerer Betrachtung sieht es tatsächlich wie ein ThreadPool-Verhungerungsproblem aus. Danke für die Hilfe, Leute. – JamesPD

8

Siehe verschiedene Timer-Klassen in .net

Different Timer class in .net

Es gibt drei Timer-Klassen 'Timer' in .NET genannt. Es klingt, als ob Sie Windows Forms verwenden, aber tatsächlich finden Sie die System.Threading.Timer-Klasse möglicherweise nützlicher - aber seien Sie vorsichtig, da sie einen Pool-Thread zurückrufen, sodass Sie nicht direkt mit Ihrem Formular interagieren können der Rückruf

Präzisere Timer - Wie pro MSDN

Windows Forms Timer-Komponente ist single-threaded, und wird mit einer Genauigkeit von 55 Millisekunden begrenzt. Wenn Sie einen Multithread-Timer mit höherer Genauigkeit benötigen, verwenden Sie die Klasse Timer im Namespace System.Timers.

+0

Klingt, als ob er es vielleicht benutzt, aber er sagt tatsächlich, dass er 'System.Threading.Timer' verwendet, was laut der Metronom-Qualität eine der zwei" zuverlässigsten "zu wählen ist. –

+0

Hallo Romil, danke dafür, wie andere darauf hingewiesen haben, es scheint ein Threadpool-Problem zu sein, aber danke für den Tisch trotzdem. Ich bin mir sicher, dass es früher oder später nützlich sein wird. – JamesPD

Verwandte Themen