如何在C#中使用定时器publicSystem.Timers.Timertimer=newSystem.Timers.Timer(200);privatevoidbtnAutoSend_Click(objectsender,EventArgse){timer.Enabled=true;timer.Elapsed+=newSystem.Timers.ElapsedEventHandler(发送);timer.AutoReset=true;}publicvoidsend(objectsource,System.Timers.ElapsedEventArgse){this.rtbMsg.AppendText("psyche-->"+receiver+":hello");发送函数中的接收器是我在使用该函数时需要设置的参数,但是当我在发送函数中添加参数时,如:publicvoidsend(objectsource,System.Timers.ElapsedEventArgse,stringreceiver)然后它抛出一个错误。我查了MSDN,说ElapsedEventArgs只针对这些不产生数据的函数。我怎么解决这个问题?我的程序不是windows.Form,所以我不能使用System.Windows.Forms.Timer。您不能将额外的参数传递给事件处理程序回调,因为您不是调用它的人-Timer是;这就是重点;-)但是,您可以通过闭包轻松实现相同的效果:;timer.AutoReset=true;定时器。启用=真;}publicvoidsend(objectsource,System.Timers.ElapsedEventArgse,stringreceiver){this.rtbMsg.AppendText("psyche-->"+receiver+":hello");现在,Elapsed处理程序是(timerSender,timerEvent)=>lambda操作,它关闭接收器变量,并在每次触发lambda时手动调用带有额外参数的发送。在您的特定情况下,您根本不需要发件人或参数,因此无需转发它们。代码变为:privatevoidbtnAutoSend_Click(objectsender,EventArgse){timer.Elapsed+=(s_,e_)=>OnTimerElapsed(receiver);timer.AutoReset=true;定时器。启用=真;}privatevoidOnTimerElapsed(stringreceiver){this.rtbMsg.AppendText("psyche-->"+receiver+":hello");如果您想知道所有这些的开销,它是非常小的。Lambda只是语法糖,是幕后的简单函数(带有一些事件的自动委托包装器)。闭包是使用编译器生成的类实现的,但除非您确实有很多,否则您不会注意到任何代码膨胀。正如评论中所指出的那样,您似乎正在访问OnTimerElapsed代码中的UI元素-因为您没有使用Windows窗体计时器,所以您可能会在计时器恰好运行的任何线程中运行的代码出现异常当事件触发时——并且必须只能从创建它们的线程访问Windows中的UI控件。你可以搞砸了。this.Invoke手动修复它,但更容易让计时器通过SynchronizingObject属性将事件编组到正确的线程:privatevoidbtnAutoSend_Click(objectsender,EventArgse)//假设`this`实现了ISynchronizeInvoke定时器。Elapsed+=(s_,e_)=>OnTimerElapsed(receiver);timer.AutoReset=true;定时器。启用=真;最后,根据另一条评论的提示,这是另一种存储闭包引用方法对的方法,以便您稍后可以取消订阅该事件://假设`this`实现了ISynchronizeInvokeElapsedEventHandleronElapsed;onElapsed=(s_,e_)=>{timer.Elapsed-=onElapsed;//触发后清理OnTimerElapsed(receiver);};timer.Elapsed+=onElapsed;timer.AutoReset=true;定时器。启用=真;您不能将额外的参数传递给事件处理程序之类的东西。将值存储在对象级变量中,以便可以在事件处理程序中访问它。以上就是C#学习教程:HowtouseTimerinC#的全部内容分享。如果对你有用,需要进一步了解C#学习教程,希望大家多加关注——privatestringreceiver;publicSystem.Timers.Timertimer=newSystem.Timers.Timer(200);privatevoidbtnAutoSend_Click(objectsender,EventArgse){timer.Enabled=true;接收者='你的价值';timer.Elapsed+=newSystem.Timers.ElapsedEventHandler(发送);timer.AutoReset=true;}publicvoidsend(objectsource,System.Timers.ElapsedEventArgse){this.rtbMsg.AppendText("psyche-->"+receiver+":hello");}publicpartialclassForm2:Form{Timertimer=newTimer();公共Form2(){InitializeComponent();timer.Tick+=newEventHandler(timer_Tick);//每次定时器计时,timer_Tick都会被调用timer.Interval=(10)*(1000);//定时器每10秒计时一次timer.Start();//启动计时器}voidtimer_Tick(objectsender,EventArgse){//MessageBox.Show("Tick");//提醒用户vartime=DateTime.Now;label1.Text=$"{time.Hour}:{time.Minute}:{time.Seconds}:{time.Milliseconds}";}privatevoidForm2_Load(objectsender,EventArgse){}}本文采集自网络,不代表立场,如涉及侵权,请点右联系管理员删除,如需转载请注明出处:
