Ho davvero bisogno di fermare i timer che non fanno nulla?

2

Ho qui un codice di esempio:

Dim a As Boolean = False

Private Sub Timer1_Tick(sender As Object, e As EventArgs) Handles Timer1.Tick
    If a = True Then
        Console.WriteLine("Example of a task that needs to be done during tick event")
    End If
End Sub

Puoi vedere che ho un evento tick del timer, ma l'evento può essere attivato solo se e solo se sono soddisfatte determinate condizioni, che nel mio caso è a = true . Con quel codice, sono abbastanza fiducioso che a meno che non abbia lasciato a = true , ignoreremo l'evento tick.

Pensi che sia una buona idea dipendere dalle condizioni all'interno dell'evento tick invece di fermare il timer con timer1.stop() ?

    
posta Cary Bondoc 06.06.2016 - 05:01
fonte

4 risposte

8

Dipende. Quanti timer, quante volte, quale ambiente. Se esegui un timer inutilmente sessanta volte al secondo su un iPhone, stai sprecando una notevole quantità di energia e riduci la durata della batteria, perché ogni volta che il timer esegue la CPU deve passare dalla modalità sleep alla massima velocità e viceversa, che è molto costoso, se lo fai sessanta volte al secondo. Se hai un server con 128 core e il tuo timer funziona una volta all'ora, a nessuno importa.

    
risposta data 06.06.2016 - 09:44
fonte
4

Venendo da uno sfondo di sviluppo embedded, penso che sia generalmente una buona idea liberare risorse inutilizzate. Ciò è ancora valido per gli ambienti e i sistemi attuali, per quanto potenti possano essere: una risorsa non allocata è una che è possibile utilizzare altrove (in questo caso, come indicato sopra, i cicli della CPU e la carica della batteria). E ovviamente ci sono delle eccezioni alla regola, e. g. per ottimizzare la velocità mediante preallocazione, o prevenire le condizioni di gara, che dovresti fare solo quando sei sicuro che ne avrai bisogno per soddisfare alcuni requisiti.

In questo caso questa è l'ottimizzazione prematura not , come già sai quando la risorsa non è utilizzata; nessuna profilazione o analisi dettagliata necessaria, nessuna ipotesi di requisiti futuri coinvolti. Nel tempo in cui spendi a pensare se potresti già averlo fatto.

    
risposta data 06.06.2016 - 14:20
fonte
3

I am confident enough that unless I let a = true, it will disregard the tick event.

No, non lo farà.

La riga non verrà scritta sulla console, ma Timer1_Tick sarà chiamata e la condizione verrà valutata.

In termini di prestazioni, non importa molto nella maggior parte dei casi: altrimenti, vedrai i suoi effetti quando si profila la tua applicazione.

D'altro canto, anche se non ha un impatto significativo sulle prestazioni, è davvero necessario tenere premuto il timer? Perché non accenderlo e spegnerlo quando necessario?

    
risposta data 06.06.2016 - 14:36
fonte
-2

Non sembra che tu abbia bisogno di un timer. Ecco un codice che mostra un'alternativa. Prima il codice sostitutivo per il timer.

Public Sub TimerReplacement()
    Do
        doit.WaitOne()
        If isrun.WaitOne(0) Then
            'code here
            Stop
        Else
            Exit Do
        End If
    Loop
    Debug.WriteLine("END")
End Sub

Alcune variabili di controllo

Dim isrun As New Threading.ManualResetEvent(True) 'app is running
Dim doit As New Threading.AutoResetEvent(False) 'condition
Dim TimerReplacementThrd As Threading.Thread

Come avviare TimerReplacement

    TimerReplacementThrd = New Threading.Thread(AddressOf TimerReplacement)
    TimerReplacementThrd.IsBackground = True
    TimerReplacementThrd.Start()

Quando la tua condizione è soddisfatta fallo

     doit.Set()

Quando chiudi il programma o non hai più bisogno di monitorare, fai questo

    isrun.Reset()
    doit.Set()
    TimerReplacementThrd.Join()
    
risposta data 08.06.2016 - 14:02
fonte

Leggi altre domande sui tag