visual tick interval form event elapsedeventhandler dotnetperls cronometro c# timer

c# - tick - ¿Cómo paso un objeto en un evento temporizador?



timer event c# (5)

La forma más sencilla de hacerlo es cambiar el controlador de eventos a una función anónima. Le permite pasar la cadena en el punto de declaración.

string theString = ...; timer.Elapsed += (sender, e) => MyElapsedMethod(sender, e, theString); static void MyElapsedMethod(object sender, ElapsedEventArgs e, string theString) { ... }

Ok, entonces estoy usando System.Timers.Timer en .Net 4 con C #.

Tengo mi objeto temporizador así:

var timer = new Timer {Interval = 123};

Tengo mi controlador de eventos Timer Elapsed apuntado a un método así:

timer.Elapsed += MyElapsedMethod;

Y mi método se ve así:

static void MyElapsedMethod(object sender, ElapsedEventArgs e) { Console.WriteLine("Foo Bar"); }

Quiero pasar una cadena a este método, ¿cómo hago esto?

Gracias


Puede guardar una cadena en algún objeto y leerla en el controlador de eventos:

static string _value; static void MyElapsedMethod(object sender, ElapsedEventArgs e) { Console.WriteLine(_value); }

ACTUALIZACIÓN: mismo código a través de una sintaxis diferente: timer.Elapsed += (s,e) => Console.WriteLine(_value);

ACTUALIZACIÓN: Considere también usar System.Threading.Timer en su lugar

State state = new State(); Timer timer = new Timer(OnTimer, state, 0, 123); state.Value = "FooBar"; // change state object

Puede recuperar el estado en la devolución de llamada del temporizador:

static void OnTimer(object obj) { State state = obj as State; if (state == null) return; Console.WriteLine(state.Value); }


Si desea poder volver a registrar su controlador de eventos "Transcurrido" nuevamente, no debe usar un delegado sin recordarlo en una variable.

Entonces, otra solución podría ser crear una clase personalizada basada en el temporizador. Solo agregue los miembros que desee y recupere su objeto Timer personalizado del argumento "remitente" del controlador de eventos "Elapsed":

class CustomTimer : System.Timers.Timer { public string Data; } private void StartTimer() { var timer = new CustomTimer { Interval = 3000, Data = "Foo Bar" }; timer.Elapsed += timer_Elapsed; timer.Start(); } void timer_Elapsed(object sender, ElapsedEventArgs e) { string data = ((CustomTimer)sender).Data; }

Esta estrategia, por supuesto, también funciona para otros eventos y clases, siempre que la clase base no esté sellada.


Use un campo en la misma clase para guardar la cadena que desee y luego recupérela en el controlador de eventos transcurrido. Sin embargo, tendrás que tener cuidado con los problemas de subprocesos.


Timer aTimer = new Timer(300); aTimer.Elapsed += delegate { PublishGPSData(channel, locationViewModel); }; // Hook up the Elapsed event for the timer. aTimer.AutoReset = true; aTimer.Enabled = true; private void PublishGPSData(IModel channel, LocationViewModel locationViewModel) { };