首页 > 解决方案 > 如何每 N 分钟重置一个递增计数器

问题描述

我的程序中有一个计数器,我想每 10 分钟重置一次为 0。

我的程序预计会引发事件。这些事件对应于由于资源的大量使用或在我们的实验中退出测试场景而导致的警告,这将需要一些操作,例如以 CSV 的形式转储一些与测试相关的数据和以 Tiff 格式的一些图。当事件计数器达到 3 时,将每 1 分钟生成一次 Tiff 文件。

但由于 Tiff 文件很大,我希望不要过度生成这些文件。因此,重置计数器将确保仅遵循重新发生的事件以进行进一步操作。

在不添加太多不必要的细节的情况下,我的程序的主要结构如下:

class Program
{
    static void Main(string[] args)
    {
      counter = 0;

      using (an API)
      {
            // do something here, which may raise an event

            while (event)
            {
                // take an action

                counter++;  // keeps track of events raised
            }

            if (counter > 3)
            {
                // take a specific action
            }
            else
            {
                // take action B
            }

            counter = 0;    // reset counter every 10 minutes, by calling a timer or async method

            // to keep the application going
            System.Windows.Forms.Application.Run();
      }
    }

    // a timer method() // to help me reset the counter
    // or
    // an Async method ResetCounter()
}

我试图通过创建一个计时器方法来启动一个计时器:

private static bool TimeCounter() 
{ 
    System.Timers.Timer _delayTimer = new System.Timers.Timer(); 
    _delayTimer.Interval = 100000;   
    _delayTimer.Enabled = true;
    // _delayTimer.Elapsed += new ElapsedEventHandler(_delayTimer_Elapsed); // attempted to use an additional method as well that could get triggered after 10 mins but it gets too complicated
    _delayTimer.Start();
    // not sure how to set this timer to return a boolean true when time elapsed, rather than calling another method
    _delayTimer.AutoReset = autoreset; 
}

private static void _delayTimer_Elapsed(object sender, System.Timers.ElapsedEventArgs e) 
 { 
     ResetCounter(); // the method not created yet
 } 

但是采用计时器方法,首先,我不确定如何让这个计时器在时间过去时返回布尔值 true,其次,如果我在 main 方法中的 API 每次程序通过 if-else 条件时都会调用此方法这可能会再次重置计时器,而不会让前 10 分钟计时器过去。

所以遇到 async-await 我觉得这对我来说可能是一个更好的选择,我可能会调用这样的东西(在 Stackoverflow 上看到)来重置计数器?:

var result = Task.Run(async () => { return await myAsyncMethod(); }).Result;

我以前从未使用过 async-await,所以不确定如何使用 async-await 达到预期的结果。

标签: c#.net

解决方案


我会简单地与DateTime.Now

1)每当您重置计时器或第一次执行代码时保存当前时间:

var lastReset = DateTime.Now;

2)检查是否lastReset是 10 分钟或更早:

if(lastReset.AddMinutes(10) <= DateTime.Now)
{
    counter = 0;
}

推荐阅读