2016-02-11 13 views
5

Powiedzmy mam następujący kod:C# Timer z lambda zamiast z odniesieniem do metody?

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++; 
} 

Czy istnieje jakiś sposób, aby to zrobić bez zdefiniowania metody statycznej DisplayTimEvent? Coś jak:

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

Zdaję sobie sprawę, pokazuję głęboki brak zrozumienia lambdas tutaj, niemniej jednak ...

Odpowiedz

11

Jasne, po prostu:

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

Parametry dla wyrażenia lambda Muszę w zasadzie dopasować parametry dla delegata, którego próbujesz przekonwertować.

W zależności od tego, czy Timer używasz zawsze wyzwalana w tym samym wątku, czy nie, może chcieć użyć:

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

Dziękuję bardzo za szczegółowe wyjaśnienia. – VSO

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

Dzięki, wrócę do akceptacji, odkąd byłeś pierwszy. – VSO

+0

Dziękuję^_ ^, Wiedziałem, że to będzie ciasny wyścig. – Rariolu

+0

Jestem naprawdę zaskoczony, nikt wcześniej nie zadał tego pytania (przynajmniej z tego, co znalazłem). – VSO