【问题标题】:What's the most efficient way to call a method every 20 seconds每 20 秒调用一次方法的最有效方法是什么
【发布时间】:2010-05-24 14:42:11
【问题描述】:

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

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

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

感谢您的帮助。

【问题讨论】:

  • 只是想知道,但是当您可以在收到每个人的同时处理每个人,为什么要每 20 秒处理一个人呢?
  • 它是作为一个例子,可能是一个笨拙的例子:),它真的是如何每隔 n 秒调用一次具有强类型参数的方法。

标签: c#


【解决方案1】:

System.Threading.Timer 是您所需要的:

提供一种按指定时间间隔执行方法的机制。

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

还有System.Windows.Forms.Timer:

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

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

别忘了System.Timers.Timer:

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

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

因此,请逐一调查并确定哪一个最适合您的情况。

【讨论】:

  • 如果他使用 Windows 窗体 System.Windows.Forms.Timer 是更好的选择,因为回调将在 UI 线程上。
  • @Petar - 谢谢你,我已经更新了答案以涵盖两者。
  • 还有一个 System.Timers.Timer。也许您可以将其添加到您的答案中以确保完整性?
  • 其中,System.Windows.Forms.Timer 将具有最高的准确性,因为它基于 WM_TIMER 消息,该消息是一个非常低优先级的消息,并且仅在消息中的所有其他消息中传递一次队列已处理完毕。
【解决方案2】:

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

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

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

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

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

或异步变体 BeginInvoke

【讨论】:

    【解决方案3】:

    你可以使用它,只要确保你所做的一切都是线程安全的。

    
    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
    }
    

    【讨论】:

    • 在名为Timer的.net框架中至少有3 classes。你应该澄清你在说哪一个。 (我从构造函数中假设您指的是System.Threading.Timer)
    • 是的,我应该更清楚。编辑为包括 System.Threading 命名空间。另外,请注意,我的解决方案不保证 ProcessPerson 只会每 20 秒调用一次,它会每 20 秒调用一次 ProcessPerson,无论最后一个 ProcessPerson 是否完成。
    猜你喜欢
    • 1970-01-01
    • 2010-10-24
    • 1970-01-01
    • 2019-07-12
    • 2011-01-11
    • 2012-01-16
    • 2012-02-14
    • 1970-01-01
    相关资源
    最近更新 更多