如何将sender参数传递给system.timers.timer

如何将sender参数传递给.NET中的system.timers.timer

 timer1[timer] = new System.Timers.Timer(interval); timer1[timer].AutoReset = true; timer1[timer].Elapsed += new ElapsedEventHandler(datatransferEvent); timer1[timer].Start(); GC.KeepAlive(timer1[timer]); private void timer_Elapsed(object sender, ElapsedEventArgs e) { try { serverreconnected.Stop(); reconnect(_opcServer); } finally { serverreconnected.Start(); } } 

例:

 System.Threading.Timer timer1; timer1= new System.Threading.Timer(databaseTrensfer, row, dueTime, interval); public void databaseTrensfer(object row) { DataRow rowE = (DataRow)row; } 

行传递给函数databaseTrensfer()的参数

我想将sender参数传递给事件。

提前致谢。

我喜欢zabulus的方法,但还有另一种选择。 创建自己的Timer类,它inheritance自System.Timers.Timer,它可以保存任何你想要的东西。 我选择了基本对象Tag属性,因此可以在其他项目中重用它。

 public class MyTimer : System.Timers.Timer { public MyTimer(double interval) : base(interval) { } public object Tag { get; set; } } MyTimer timer; void test(object sender) { timer = new MyTimer(1); timer.Tag = sender; timer.Elapsed += new System.Timers.ElapsedEventHandler(timer_Elapsed); } void timer_Elapsed(object sender, System.Timers.ElapsedEventArgs e) { MyTimer timer = (MyTimer)sender; object tag = timer.Tag; // do whatever you want with tag } 

然后调用test(with whatever value you want to pass)

创建保存行的聚合类。

 class RowHolderEventArgs : EventArgs { public DataRow row; public RowHolderEventArgs(DataRow row) { this.row = row; } }; public delegate void RowHolderEvent(object sender, RowHolderEventArgs e); class RowHolder { public event RowHolderEvent Elapsed; DataRow row; public RowHolder(DataRow row, Timer timer) { this.row = row; timer.Elapsed += new ElapsedEventHandler(timer_Elapsed); } void timer_Elapsed(object sender, ElapsedEventArgs e) { if (this.Elapsed != null) { Elapsed(sender, new RowHolderEventArgs(row)); } } } 

运用

 timer1[timer] = new System.Timers.Timer(interval); rowHolder[timer] = new RowHolder(timer1[timer],row[timer]); rowHolder.Elapsed+=new RowHolderEvent(databaseTrensfer) public void databaseTrensfer(object sender, HolderEventArgs e) { DataRow rowE = (DataRow)e.row; } 

怎么样的:

 static Timer timer; static void Main(string[] args) { var row = default(DataRow); // Some row timer = new Timer(30000); timer.Elapsed += (_, __) => databaseTrensfer(row); } static void databaseTrensfer(DataRow row) { // Do something with 'row' }