2010-10-14 9 views
7

Wie viel Overhead verursachen Timer in einer Anwendung, wenn sie kontinuierlich im Hintergrund laufen (unabhängig vom Intervall)?Overhead des Timers in der Anwendung C#

Ich mache mir keine Sorgen über die Anrufe, die der Timer macht, wenn es tickt, sondern eher über die Leistungseffekte der Verwendung von Timern in Anwendungen, in denen Leistung von größter Bedeutung ist und interessiert sind, welche Ansichten es gibt .

+0

Es gibt Arten von Zeiten in .net http://msdn.microsoft.com/en-us/magazine/cc164015.aspx über welche sprechen Sie? – Andrey

+0

Nun, ich bezog mich auf Timer im Allgemeinen - aber die aktuelle Anwendung, in der ich am meisten betroffen war, ist eine Silverlight-Anwendung, so dass ich den DispatcherTimer verwenden würde. Danke – Madeleine

Antwort

8

Der Timer, zwischen seinen Ticks, fügt eine extrem niedrige Kosten für die Anwendung hinzu. Es verwendet den Mechanismus des Betriebssystems für die Planung (der unabhängig von Ihren Aktionen aktiv ist), im Gegensatz zum intuitiven Konzept, die Systemuhr ständig abzufragen.

Grundsätzlich, andere als die zusätzlichen Speicher und Kontext wechseln Daten hinzufügen (kleinere Ergänzungen in diesem Fall. Sollte nicht mehr als dann eine Schaltfläche zu Ihrem Formular hinzufügen) sollte es nicht mehr Overhead sein.

+1

Wenn es um Timer und Threading geht, sind "Pooling" und "Polling" zwei verschiedene Wörter, die man vorsichtig buchstabieren sollte;) – d7samurai

+0

Whoops! Mein Fehler. Danke, @ d7samurai. – Neowizard

+0

Der von Ihnen genannte "OS-Mechanismus für die Zeitplanung" wird als [** message loop **] (https://en.wikipedia.org/wiki/Message_loop_in_Microsoft_Windows) bezeichnet, mit dem Nachrichten in die Warteschlange gestellt werden. Die Anwendung verfügt über eine Ereignisschleife, die Nachrichten aus dieser Nachrichtenwarteschlange abruft. – BornToCode

0

Das vom Timer aufgerufene Ereignis wird im selben Thread ausgeführt, zu dem der Timer gehört, und blockiert daher diesen Thread während der Ausführung einer beliebigen Logik. Das bedeutet, dass die Ausführung der Timer.Tick-Methode die GUI während der Ausführung blockiert, wenn der Timer zur GUI-Ebene gehört.

Um die Leistung im Haupt-Thread zu erhalten, empfehle ich stattdessen eine BackgroundWorker, die in einem eigenen Thread läuft.

+0

Es gibt Arten von Zeiten in .net http://msdn.microsoft.com/en-us/magazine/cc164015.aspx worüber sprichst du? – Andrey

+0

Ich bezog mich auf System.Windows.Forms.Timer mit meiner Aussage oben. –

0

Um auf die gleiche Weise zu antworten: Timer sind für die GUI-Programmierung von unschätzbarem Wert, aber für Hochleistungsaufgaben ziemlich nutzlos. Einige Probleme mit Timer:

  • sind sie auf die Millisekunde nicht regelmäßig (in der Tat in den Fenstern, nichts ist) - es wird ausgelöst, wenn seine Zeit, aber wenn alle anderen Nachrichten (Maus-Tastatur-Ereignisse, aktualisiert die Steuerung) verarbeitet werden, weil sie mit anderen Meldungen vom/zum gui
  • nicht .net Implementierung wissen, aber sie verschwendet Griffe in mfc

Wenn Sie erwägen, einen anderen Thread für einige Operation, stellen Sie sicher, serialisiert dass du keine GUI-Komponente davon berührst. Verwenden Sie entweder Invoke() oder kopieren Sie Aktualisierungen für eine GUI in eine Warteschlange, und entfernen Sie sie dann mit dem Timer aus dem GUI-Hauptthread.

Verwandte Themen