如何将多个参数传递给system.threading.timer()

时间:2011-06-17 05:54:01

标签: c# .net

如何将多个参数传递给C#中System.Threading.Timer()所期望的回调?

timer1[timer] = new System.Threading.Timer(databaseTrensfer, row, dueTime, interval);

public void databaseTrensfer(object row,object unitID)
{
   // do work here
}

如何将第二个参数传递给databaseTrensfer函数? 提前谢谢。

2 个答案:

答案 0 :(得分:4)

为什么不创建一个包含要传入的其他项的属性的类?然后只需传递实际的容器类。

答案 1 :(得分:3)

定时器回调定义为采用单个参数:

public delegate void TimerCallback(object state);

如果你需要向你的回调传递几个参数,这些参数在Timer构造函数上注册回调时已知,那么你可以使用lambda:

Timer CreateTimer(object unitID)
{
    object   row      = ...
    TimeSpan dueTime  = ...
    TimeSpan interval = ...

    return new Timer(x => DatabaseTransfer (x, unitID), row, dueTime, interval);
}

static void DatabaseTransfer(object row, object unitID)
{
    ....
}

撰写x => DataTransfer (x, unitID)会捕获unitID变量的状态,大致相当于此:

Timer CreateTimer(object unitID)
{
    object   row      = ...
    TimeSpan dueTime  = ...
    TimeSpan interval = ...

    $Temp temp = new $Temp (unitID);

    return new Timer(temp.Callback, row, dueTime, interval);
}

class $Temp
{
    public $Temp(object arg)
    {
        this.arg = arg;
    }
    public void Callback(object x)
    {
        DataTransfer (x, this.arg);
    }
    private object arg;
}

编译器负责在幕后构建类和管道。例如,请参阅explanation about closures