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

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

我有我的计时器对象:

 var timer = new Timer {Interval = 123}; 

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

 timer.Elapsed += MyElapsedMethod; 

我的方法看起来像这样:

 static void MyElapsedMethod(object sender, ElapsedEventArgs e) { Console.WriteLine("Foo Bar"); } 

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

谢谢

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

 string theString = ...; timer.Elapsed += (sender, e) => MyElapsedMethod(sender, e, theString); static void MyElapsedMethod(object sender, ElapsedEventArgs e, string theString) { ... } 

如果您希望能够再次注销“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; } 

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

您可以将字符串保存在某个对象中并在事件处理程序中读取它:

 static string _value; static void MyElapsedMethod(object sender, ElapsedEventArgs e) { Console.WriteLine(_value); } 

更新:通过不同的语法相同的代码: timer.Elapsed += (s,e) => Console.WriteLine(_value);

更新:请考虑使用System.Threading.Timer

 State state = new State(); Timer timer = new Timer(OnTimer, state, 0, 123); state.Value = "FooBar"; // change state object 

您可以在计时器回调中检索状态:

 static void OnTimer(object obj) { State state = obj as State; if (state == null) return; Console.WriteLine(state.Value); } 
  Timer aTimer = new Timer(300); aTimer.Elapsed += delegate { PublishGPSData(channel, locationViewModel); }; // Hook up the Elapsed event for the timer. aTimer.AutoReset = true; aTimer.Enabled = true; private void PublishGPSData(IModel channel, LocationViewModel locationViewModel) { }; 

使用同一个类中的字段来保存您想要的任何字符串,然后在已用事件处理程序中检索它。 但是,您必须小心交叉线程问题。