【问题标题】:How to trigger an event for the given interval of time repeatedly in c#?如何在c#中重复触发给定时间间隔的事件?
【发布时间】:2013-06-02 04:37:46
【问题描述】:

如何安排事件,例如,我需要调用一个方法,该方法应在给定的每一秒内执行其操作。我正在开发简单的 Windows 窗体应用程序,我尝试使用 like

while(true)
{
 methodToBeScheduled();
 Thread.Sleep(60000);
}

这段特殊的代码使我的应用程序在执行时“无响应”。我希望计时器可以做到这一点或您专家建议的任何其他逻辑,请告诉我。

谢谢!

【问题讨论】:

    标签: c# .net multithreading winforms


    【解决方案1】:

    您可以使用WinForms timer:

    Timer _timer;
    
    // In constructor (or anywhere you want to start the timer, e.g. a button event):
    _timer = new Timer();
    _timer.Interval = 60000;    // milliseconds
    _timer.Tick += (sender, e) => methodToBeScheduled();
    _timer.Start();
    

    这将导致methodToBeScheduled 大约每 60 秒调用一次。它将在主 UI 线程上调用,因此请避免在其中进行任何繁重的处理。

    使用这个定时器的好处是它是内置的,不需要线程同步,使用简单。缺点是间隔不准确——实际间隔会根据应用程序中需要处理的其他消息而有所不同,并且还受制于 Windows 系统时钟,仅精确到 10-20ms 或所以。

    【讨论】:

    • 嗨,卡梅伦,谢谢。如何设置 methodToBeScheduled() 的计时器;在按钮单击事件之后,而不是来自构造函数。
    • @Renish,您只需将逻辑移至按钮单击方法 - 但是,请将 Timer 保留为属性(在方法之外),否则可能会被垃圾收集。
    【解决方案2】:

    您可以使用Timer(System.Threading.Timer)。

    using System;
    using System.Threading;
    
    Timer _timer = null;
    
    
    _timer = new Timer(o =>
        {
            methodToBeScheduled();
        });
    _timer.Change(TimeSpan.Zero, TimeSpan.FromSeconds(60));
    

    【讨论】:

      【解决方案3】:

      Var 序列 = Observable.interval(1).publish 序列.订阅 ....

      将允许订阅一个每秒触发一次 onnext 的 observable。查看响应式扩展..

      讨厌在 iPad 上打字......

      【讨论】:

        【解决方案4】:

        是的,.net 中有三种不同类型的计时器(所有这些都被命名为 Timer,但行为略有不同)。 windows.forms 计时器以一定的速率执行一个函数——它从 UI 线程调用该函数。 System.Threading Timer 执行相同的操作,但从另一个线程调用该函数。还有一个计时器,我不记得了。您必须根据自己的情况选择其中之一。

        线程计时器是我的最爱。 Here 是一个如何使用它的例子。请记住,您所调用的任何内容都不是从 UI 线程完成的。如果有问题,可能需要使用表单计时器或同步事物。

        【讨论】:

        • 我相信第三个计时器是 WPF 的?
        • @Cameron:Windows 窗体应用程序通常使用三个计时器:System.Windows.Forms.TimerSystem.Timers.TimerSystem.Threading.TimerDispatcherTimer 是 Windows 窗体计时器的 WPF 等效项(不是真正等效的,而是类似的)。
        猜你喜欢
        • 2021-05-03
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        相关资源
        最近更新 更多