Timer e ElapsedEventHandler

mercoledì 28 dicembre 2011 - 15.58
Tag Elenco Tags  C#  |  .NET 2.0

luca1988 Profilo | Newbie

Ciao a tutti! Sto usando un timer del tipo using System.Timers.Timer.
Il modo classico di procedere sarebbe con NOMETIMER.Elapsed += new ElapsedEventHandler(tmrService_Elapsed); dove il metodo richiamato deve essere private void tmrService_Elapsed(object sender, EventArgs e) { ... }.

Ma se io volessi richiamare un metodo custom allo scadere del timer? Una cosa del tipo private void Prova(string testo) { ... } come dovrei comportarmi con delegati, eventi e handler?

Se possibile sarebbe utile un piccolo frammento di codice come soluzione.
Grazie a tutti,

Luca

Jeremy Profilo | Guru

Ciao
La firma del metodo deve essere sempre quella che hai usato, gli argomenti li puoi passare creando una classe che eriditi da EventArgs la quale passerai come riferimento nella sottoscrizione del gestore.
Facci sapere.

luca1988 Profilo | Newbie

Ciao Jeremy e grazie per la risposta.. ho provato a mettere in pratica il tuo consiglio su un programmino di test ma qualcosa non funziona..
Quello che mi aspetto è che ogni dieci secondi il timer scada e passi il parametro "tea" al metodo tmrService_Elapsed che ora accetta come secondo parametro un TimerEventArgs.

Il compilatore mi restituisce l'errore "Method name expected" sulla riga tmrService.Elapsed += new ElapsedEventHandler(tmrService_Elapsed(this, tea));.

Di seguito la parte di codice incriminata (il codice è racchiuso nello stesso namespace):

public class TimerEventArgs : EventArgs
{
private readonly DateTime _now;
public TimerEventArgs(DateTime Now)
{
_now = Now;
}
public DateTime Now
{
get { return _now; }
}
}

public partial class Form1 : Form
{
System.Timers.Timer tmrService = new System.Timers.Timer();

private void tmrService_Elapsed(object sender, TimerEventArgs e)
{
MessageBox.Show(e.Now.ToString());
}

private void Form1_Load(object sender, EventArgs e)
{
TimerEventArgs tea = new TimerEventArgs(DateTime.Now);
tmrService.Interval = 10000;
tmrService.Elapsed += new ElapsedEventHandler(tmrService_Elapsed(this, tea));
tmrService.Enabled = true;
tmrService.Start();
}
}

Hai qualche idea su come correggere? Grazie ancora e buon anno!

Jeremy Profilo | Guru

A prima vista mi sembra di vedere un pò di casino nella dichiarazione delle proprietà della classe TimerEventArgs. . . . . Ad ogni modo stasera ci guardo meglio e ti faccio sapere.
Ciao.

Jeremy Profilo | Guru

Ciao Luca.
Finalmente ho trovato un pò di tempo per dargli un occhio.
Effettivamente ci sono degli errori, ma non avevo capito che fossero del compilatore, altrimenti avrei fatto più attenzione alla sintassi.

Ecco il codice corretto:
private System.Timers.Timer tmrService = new System.Timers.Timer(); private TimerEventArgs TimerArgs = new TimerEventArgs(); private void Form1_Load(object sender, System.EventArgs e) { tmrService.Elapsed += delegate(object form, System.Timers.ElapsedEventArgs args) { _Elapsed(this, TimerArgs); }; tmrService.Interval = 1000; tmrService.Enabled = true; tmrService.Start(); } private void _Elapsed(object sender, TimerEventArgs e) { MessageBox.Show(e.Argomento.ToString()); } public Form1() { } } public class TimerEventArgs : System.Timers.ElapsedEventArgs { private int _Argomento; public int Argomento { get { _Argomento += 1; return _Argomento; } set { _Argomento = value; } } } }

ovviamente è un codice di test, da adattare alle tue esigenze, ma sufficiente a chiarirti il concetto.
Se hai dubbi rimango a disposizione per ultriori info.
Facci sapere....
Ciao

luca1988 Profilo | Newbie

Ciao e scusa se non ho più risposto ma sono tornato solo oggi al lavoro! Ho provato il tuo codice ma mi segnala un errore sulla dichiarazione della classe: "The type 'System.Timers.ElapsedEventArgs' has no constructors defined"..

Jeremy Profilo | Guru

Ciao Luca.
Il C# non è proprio nelle mie corde .... ad ogni modo con questo codice:
using System; using System.Collections.Generic; using System.ComponentModel; using System.Data; using System.Drawing; using System.Linq; using System.Text; using System.Windows.Forms; namespace WindowsFormsApplication3 { public partial class Form1 : Form { public Form1() { InitializeComponent(); } private TimerEventArgs Args = new TimerEventArgs(); private void Form1_Load(object sender, System.EventArgs e) { System.Windows.Forms.Timer tmrService = new System.Windows.Forms.Timer(); tmrService.Tick += delegate(object form, EventArgs args) { _Elapsed(this, Args); }; tmrService.Interval = 1000; tmrService.Enabled = true; tmrService.Start(); } private void _Elapsed(object sender, TimerEventArgs e) { System.Windows.Forms.MessageBox.Show(e.Argomento.ToString()); } } public class TimerEventArgs : EventArgs { private int _Argomento; public int Argomento { get { _Argomento += 1; return _Argomento; } set { _Argomento = value; } } public TimerEventArgs() { } } }
ho compilato ed eseguito correttamente.

Facci sapere...
Ciao

luca1988 Profilo | Newbie

Grazie Jeremy.. ora funziona! Non avevo notato nel messaggio precedente che in realtà la riga

public class TimerEventArgs : System.Timers.ElapsedEventArgs

doveva essere

public class TimerEventArgs : EventArgs

come in effetti è nell'ultimo esempio che hai postato!

Grazie ancora e buona giornata!

Partecipa anche tu! Registrati!
Hai bisogno di aiuto ?
Perchè non ti registri subito?

Dopo esserti registrato potrai chiedere
aiuto sul nostro Forum oppure aiutare gli altri

Consulta le Stanze disponibili.

Registrati ora !
Copyright © dotNetHell.it 2002-2017
Running on Windows Server 2008 R2 Standard, SQL Server 2012 & ASP.NET 3.5