如何将对象传递给计时器事件?
好的,我在.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) { };
使用同一个类中的字段来保存您想要的任何字符串,然后在已用事件处理程序中检索它。 但是,您必须小心交叉线程问题。