2010-10-14 12 views
7

Quanto sovraccarico fanno timer causano in un'applicazione se sono in esecuzione in background in modo continuo (indipendentemente dall'intervallo)?Overhead di timer in un'applicazione C#

Non sono preoccupato per le chiamate che il timer farà quando funziona, ma piuttosto per gli effetti delle prestazioni dell'uso dei timer nelle applicazioni in cui le prestazioni sono della massima importanza e sono interessato a sentire quali opinioni ci sono su questo .

+0

ci Ci sono tipi di volte in .net http://msdn.microsoft.com/en-us/magazine/cc164015.aspx quale stai parlando? – Andrey

+0

Bene, mi riferivo ai timer in generale, ma l'applicazione corrente in cui ero più interessato era un'applicazione Silverlight, quindi avrei utilizzato DispatcherTimer. Grazie – Madeleine

risposta

8

Il timer, tra esso è zecche, aggiunge un costo estremamente basso per l'applicazione. Utilizza il meccanismo del sistema operativo per la pianificazione (che è attivo indipendentemente dalle azioni dell'utente), in contrasto con il concetto intuitivo di eseguire il polling costante dell'orologio del sistema.

In altre parole, oltre alla memoria aggiunta e aggiunta di dati di commutazione di contesto (aggiunte secondarie in questo caso. Non dovrebbe essere più di aggiungere un pulsante al modulo) non ci dovrebbero essere ulteriori spese generali.

+1

Quando si tratta di timer e filettatura, "messa in comune" e "polling" sono due parole diverse che si deve fare attenzione a scrivere correttamente;) – d7samurai

+0

Whoops! Colpa mia. Grazie, @ d7samurai. – Neowizard

+0

Il "meccanismo del sistema operativo per la pianificazione" menzionato si chiama [** message loop **] (https://en.wikipedia.org/wiki/Message_loop_in_Microsoft_Windows) che accoda i messaggi. L'applicazione ha un ciclo di eventi che riceve messaggi da quella coda di messaggi. – BornToCode

0

L'evento invocata dal timer verrà eseguito nello stesso thread che il timer appartiene, e quindi blocca quel filo durante l'esecuzione di qualsiasi logica. Ciò significa che se il Timer appartiene al livello della GUI, l'esecuzione del metodo Timer.Tick bloccherà la GUI mentre è in esecuzione.

Per mantenere le prestazioni nel thread principale, suggerisco di utilizzare un BackgroundWorker invece che venga eseguito nel proprio thread.

+0

Ci sono tipi di volte in .net http://msdn.microsoft.com/en-us/magazine/cc164015.aspx quale stai parlando? – Andrey

+0

Mi riferivo a System.Windows.Forms.Timer con la mia affermazione sopra. –

0

Rispondere allo stesso modo: i timer sono inestimabili per la programmazione GUI, ma sono praticamente inutili per attività ad alte prestazioni. Alcuni problemi con timer:

  • non sono regolari al millisecondo (in realtà in finestre, niente è) - sarà il fuoco quando è il suo tempo, ma quando tutti gli altri messaggi (eventi del mouse-tastiera, gli aggiornamenti di controllo) sono trattati, perché è serializzato con altri messaggi da/per gui
  • non sanno implementazione .net, ma hanno sprecato maniglie in MFC

Se state pensando di un altro thread per qualche operazione, assicurarsi che non tocchi alcun componente gui da esso. Utilizzare Invoke() o copiare gli aggiornamenti per una GUI in qualche coda, quindi desinstalarla con timer dal thread principale della GUI.