2011-06-16 24 views
3

如何在.NET中将sender参数传递给system.timers.timer如何将sender参数传递给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()

我想将发送者参数传递到该事件。

在此先感谢。

+2

咦?那不是你的工作。计时器实例触发事件。发件人通常包含发射实例,但您不能总是依赖该实例。 – leppie 2011-06-16 07:23:25

+0

我不太了解你的问题。当事件发生时,sender参数会自动填充发送计时器。 – Falanwe 2011-06-16 07:25:41

+0

我想通过参数来像线程传递对象或window.timer传递标签属性 – vrushali 2011-06-16 07:32:13

回答

1

创建用于保存行的聚合类。

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

我喜欢zabulus的方法,但有一个替代方案。创建你自己的继承自System.Timers.Timer的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)

+1

为您的答案投票这是我的第一个建议,但是我在类中没有弄错:System.Threading.Timer与System.Timers.Timer不同。 – zabulus 2011-06-17 08:35:33

+0

您好,如何将标签对象转换为字符串? – k4lls 2014-03-26 01:56:47

+0

@ k4lls要么'timer.Tag.ToString()'或'(字符串)timer.Tag' – 2014-03-26 22:56:49

1

什么是这样的:

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' 
}