笔者最近在使用System.Timers.Timer类时,对于如何在Elapsed事件触发时向事件处理函数传递参数存在一些疑惑,后来总算解决了相关问题。总结如下:
1.匿名函数传递
使用Lambda表达式,编写一个匿名方法,直接在订阅事件的同时实现方法体;代码如下:
<strong> </strong><span style="font-weight: bold; white-space: pre;"> </span><span style="font-size:14px;color:#3366ff;">System.Timers.Timer m_timerCheckDTUState=null ;</span>
<span style="font-size:14px;color:#3366ff;"><span style="white-space:pre"> </span>//传递的参数 test</span>
<span style="font-size:14px;color:#3366ff;"> <span style="white-space:pre"> </span>var test = "this param is a test";
m_timerCheckDTUState = new System.Timers.Timer();
m_timerCheckDTUState.Interval = 6000;
m_timerCheckDTUState.Start();
//传递参数方法一
m_timerCheckDTUState.Elapsed += (sender, e) => {
Console.WriteLine(test);
} ;</span>
当然,这个事件处理函数比较简单,如果觉得这样会导致代码冗余,也可以不使用匿名方法,方法如下
2.非匿名函数传递
<span style="white-space:pre"> </span><span style="font-size:18px;">System.Timers.Timer tmr = new System.Timers.Timer();
tmr.Interval = 500;
tmr.Elapsed += new ElapsedEventHandler(tmr_Elapsed);
tmr = new System.Timers.Timer();
string test="</span><span style="color: rgb(51, 102, 255); font-size: 14px; font-family: Arial, Helvetica, sans-serif;">this param is a test</span><span style="font-size:18px;">";
//传递参数方法2
tmr.Elapsed += new ElapsedEventHandler((s,e)=>tmr_Elapse(s,e,test));
tmr.Start();</span>
<span style="font-size:18px;"><span style="white-space:pre"> </span> void tmr_Elapse(object sender, ElapsedEventArgs e,string a)
{
Console.WriteLine("Tick...tick tick"+a);
}</span>