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

时间:2010-05-24 14:42:11

标签: c# c#-4.0

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

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

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

感谢您的帮助。

3 个答案:

答案 0 :(得分:23)

您需要System.Threading.Timer

  

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

     

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

还有System.Windows.Forms.Timer

  

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

     

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

不要忘记System.Timers.Timer

  

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

     

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

因此,请对每一项进行调查,并确定哪种方法最适合您的情况。

答案 1 :(得分:4)

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

你没有说这个函数是否会执行任何类型的UI更新,但是如果你还应该知道回调函数将在不同的线程上执行,所以在某些情况下,如执行UI更新,你需要采取适当的措施将请求编组回UI线程。

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

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

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

或Async变体BeginInvoke

答案 2 :(得分:0)

你可以使用它,只要确保你正在做的事情是线程安全的。


using System.Threading;

public void DoStuff(IPerson person)
{
    new Timer(ProcessPerson, person, 0, 20000);
}

public void ProcessPerson(object threadState)
{
   IPerson person = threadState as IPerson;
   // do your stuff
}