每20秒调用一次方法的最有效方法是什么

Cia*_*raM 17 c# c#-4.0

我想调用一个每20秒传递一个参数的方法,例如public void ProcessPerson(IPerson person)

我一直在阅读不同的Timer选项,并想知道是否有人可以推荐最有效的方法来做到这一点?

另外,有没有办法保持参数强类型而不是使用对象然后必须转换为IPerson?

谢谢您的帮助.

Chr*_*isF 23

A System.Threading.Timer是你需要的:

提供以指定间隔执行方法的机制.

使用TimerCallback委托指定希望Timer执行的方法.定时器委托是在构造定时器时指定的,不能更改.该方法不会在创建计时器的线程上执行; 它在系统提供的ThreadPool线程上执行.

还有System.Windows.Forms.Timer:

实现以用户定义的间隔引发事件的计时器.此计时器已针对Windows窗体应用程序进行了优化,必须在窗口中使用.

此Windows计时器专为使用UI线程执行处理的单线程环境而设计.

别忘了System.Timers.Timer:

Timer组件是一个基于服务器的计时器,它允许您指定在应用程序中引发Elapsed事件的重复间隔.

基于服务器的Timer设计用于多线程环境中的工作线程.服务器计时器可以在线程之间移动以处理引发的Elapsed事件,从而在准时引发事件时比Windows计时器更准确.

因此,调查每一个并确定哪一个在您的情况下最佳.

  • 如果他使用Windows窗体,System.Windows.Forms.Timer是一个更好的选项,因为回调将在UI线程上. (4认同)

Chr*_*lor 3

我会选择System.Threading.Timer。请记住,Windows 不是实时操作系统,因此无论您选择哪种机制,时间都会有一些差异。

您没有说明此函数是否将执行任何类型的 UI 更新,但以防万一您还应该知道回调函数将在不同的线程上执行,因此在某些情况下(例如执行 UI 更新),您将需要采取适当的操作将请求封送回 UI 线程的操作。

要将请求封送回 UI 线程,您可以执行以下操作

对于 WinForms,您可以使用Control.Invoke

对于 WPF,您可以使用Dispatcher.Invoke

或者 Async 变体 BeginInvoke