在C#中每x秒执行一次操作y分钟

10

我需要每5秒运行一次函数,持续10分钟。

我使用一个定时器来每5秒运行一次函数,但如何将定时器限制为只运行10分钟?

9个回答

15

只需要在经过的处理程序内捕获您想要停止和结束计时器的时间。这是一个示例(注意:我使用了一个 System.Threading.Timer timer。根据您正在进行的操作选择适当的计时器。例如,如果您正在编写 Winforms,则可能需要使用 System.Windows.Forms.Timer)。

public class MyClass
{
    System.Threading.Timer Timer;
    System.DateTime StopTime;
    public void Run()
    {
        StopTime = System.DateTime.Now.AddMinutes(10);
        Timer = new System.Threading.Timer(TimerCallback, null, 0, 5000);
    }

    private void TimerCallback(object state)
    {
        if(System.DateTime.Now >= StopTime)
        {
            Timer.Dispose();
            return;
        }
        // Do your work...
    }
}

10

让你的计时器循环类似于这样:

DateTime endTime = DateTime.Now.AddMinutes(10);

while(endTime < DateTime.Now)
{
  // Process loop
}

2
我宁愿存储“结束时间”并在每次迭代之前将其与当前时间值进行比较。尽管如此,+1。 - Cerebrus

6

将Y分钟除以X间隔,得到需要运行的次数。然后只需计算函数被调用的次数即可。

在您的情况下,10分钟= 600秒/ 5秒= 需要120次调用。只需使用计数器跟踪函数被调用的次数即可。


3

在120个Ticks之后,执行Timer.Stop()


简单的答案不受欢迎吗? :) - JP Alioto

3

只需使用一个DateTime变量来跟踪何时应该结束,并在开始之前设置它。然后在您的Elapsed事件处理程序中,检查信号时间是否小于结束时间。如果不是,则停止计时器。


3

您可以计算函数将被调用的次数,并创建递减计数器。当计数器耗尽时,您可以取消订阅计时器滴答声。或者,您可以运行另一个计时器,其滴答周期为10分钟,每次滴答时取消订阅计时器并调用您的函数。


2
您可以使用第二个计时器:
class Program
{
    static void Main(string[] args)
    {
        int interval = 5 * 1000; //milliseconds
        int duration = 10 * 60 * 1000; //milliseconds

        intervalTimer = new System.Timers.Timer(interval);
        durationTimer = new System.Timers.Timer(duration);

        intervalTimer.Elapsed += new System.Timers.ElapsedEventHandler(intervalTimer_Elapsed);
        durationTimer.Elapsed += new System.Timers.ElapsedEventHandler(durationTimer_Elapsed);

        intervalTimer.Start();
        durationTimer.Start();
    }

    static void durationTimer_Elapsed(object sender, System.Timers.ElapsedEventArgs e)
    {
        intervalTimer.Stop();
        durationTimer.Stop();
    }

    static void intervalTimer_Elapsed(object sender, System.Timers.ElapsedEventArgs e)
    {
        //call your method
    }

    private static System.Timers.Timer intervalTimer;
    private static System.Timers.Timer durationTimer;
}

2

注意开始时间。在每次调用中,测试是否 currentTime + 5 seconds > startTime + 10 minutes。如果是,则禁用计时器。

我更喜欢这种方法,而不仅仅是运行 N 次 ticks,因为不能保证计时器触发的时间与您想要的时间相同。可能会出现 120 次 ticks 运行超过实际世界时间的 10 分钟的情况。


2

您可以设置两个定时器,一个运行5秒钟,另一个运行10分钟,并禁用第一个定时器。


网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接