如何将发送者参数传递给系统定时器(system.timers.timer)?

6

如何在.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()的参数。

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

提前致谢。


2
什么?那不是你的工作。计时器实例触发事件。发送方通常包含触发实例,但你不能总是依赖它。 - leppie
我不是很理解你的问题。发送方参数将在事件触发时自动填充为发送计时器。 - Falanwe
我想像线程传递对象或窗口计时器传递标签属性一样传递参数。 - vrushali
请给我们展示一个你想要的例子,因为你的解释不够清楚。 - Chuck Savage
3个回答

12

我喜欢zabulus的方法,但还有一种替代方案。创建自己的Timer类,继承自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)


1
投票支持你的答案,这是我的第一个建议,但我在类方面有一些错误:System.Threading.Timer是密封的,而System.Timers.Timer则不是。 - zabulus
你好,我该如何将标签对象转换为字符串? - k4lls
@k4lls 可以使用 timer.Tag.ToString()(string)timer.Tag - Chuck Savage
1
这很棒!我认为通过更改为通用的 MyTimer<T>,然后使用 public T Tag {get;set;} 属性,可以进一步改进它,这样你就不需要强制转换对象。 - styfle

2
创建一个聚合类来保存你的行数据。
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;
}

2

那么类似以下内容怎么样:

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

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接