2016-02-11 14 views
5

Diciamo che ho il seguente codice:Timer C# con lambda invece del metodo di riferimento?

var secondsElapsed = 0; 

Timer myTimer = new Timer(); 
myTimer.Elapsed += new ElapsedEventHandler(iterateSecondsElapsed); 
myTimer.Interval = 1000; 
myTimer.Start(); 


//Somewhere else in the code: 
public static void iterateSecondsElapsed(object source, ElapsedEventArgs e) 
{ 
    secondsElapsed++; 
} 

Esiste un modo per fare questo senza definire il metodo statico DisplayTimEvent? Qualcosa di simile:

myTimer.Elapsed += new ElapsedEventHandler(secondsElapsed => secondsElapsed ++); 

Mi rendo conto che sto mostrando una profonda mancanza di comprensione del lambda qui, ma ciò nonostante ...

risposta

11

Certo, basta:

myTimer.Elapsed += (sender, args) => secondsElapsed++; 

I parametri per l'espressione lambda devi abbinare i parametri per il delegato a cui stai provando a convertirlo, in pratica.

A seconda che il Timer si sta utilizzando sempre spara sullo stesso thread o no, si può decidere di utilizzare:

myTimer.Elapsed += (sender, args) => Interlocked.Increment(ref secondsElapsed); 
+0

La ringrazio molto per la spiegazione dettagliata. – VSO

4
myTimer.Elapsed += (sender, e) => {secondsElapsed++;}; 
+0

Grazie, tornerà ad accettare da quando sei stato il primo. – VSO

+0

Grazie^_ ^, sapevo che questa sarebbe stata una gara serrata. – Rariolu

+0

Sono davvero sorpreso che nessuno abbia mai fatto questa domanda (almeno da quello che ho trovato). – VSO

Problemi correlati