如何将对象传递给计时器事件?

JMK*_*JMK 29 c# timer

好的,我System.Timers.Timer在.Net 4中使用C#.

我有我的计时器对象:

var timer = new Timer {Interval = 123};
Run Code Online (Sandbox Code Playgroud)

我有一个Timer Elapsed事件处理程序指向一个像这样的方法:

timer.Elapsed += MyElapsedMethod;
Run Code Online (Sandbox Code Playgroud)

我的方法看起来像这样:

static void MyElapsedMethod(object sender, ElapsedEventArgs e)
{
    Console.WriteLine("Foo Bar");
}
Run Code Online (Sandbox Code Playgroud)

我想将一个字符串传递给这个方法,我该怎么做?

谢谢

Jar*_*Par 73

最简单的方法是将事件处理程序更改为匿名函数.它允许您在声明点传递字符串.

string theString = ...;
timer.Elapsed += (sender, e) => MyElapsedMethod(sender, e, theString);

static void MyElapsedMethod(object sender, ElapsedEventArgs e, string theString) {
  ...
}
Run Code Online (Sandbox Code Playgroud)

  • 我认为不鼓励内联分配事件处理程序,因为它们之后无法释放? (3认同)
  • 实际上你还在阅读一些全局变量(是的,它可能是本地的,但没有任何意义).刚刚用匿名函数替换了事件处理程序.这个`timer.Elapsed + =(s,e)=> Console.WriteLine(theString);`更短,但想法一样. (2认同)

Mic*_*ier 18

如果您希望能够再次注销"Elapsed"事件处理程序,则不应在不记住变量的情况下使用委托.

所以另一种解决方案可能是基于Timer创建一个自定义类.只需添加您喜欢的任何成员,并从"Elapsed"事件处理程序的"sender"参数中获取自定义Timer对象:

class CustomTimer : System.Timers.Timer
{
    public string Data;
}

private void StartTimer()
{
    var timer = new CustomTimer
    {
        Interval = 3000,
        Data = "Foo Bar"
    };

    timer.Elapsed += timer_Elapsed;
    timer.Start();
}

void timer_Elapsed(object sender, ElapsedEventArgs e)
{
    string data = ((CustomTimer)sender).Data;
}
Run Code Online (Sandbox Code Playgroud)

这个策略当然适用于其他事件和类,只要基类没有被密封.