我需要每5秒运行一次函数,持续10分钟。
我使用一个定时器来每5秒运行一次函数,但如何将定时器限制为只运行10分钟?
只需要在经过的处理程序内捕获您想要停止和结束计时器的时间。这是一个示例(注意:我使用了一个 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...
}
}
让你的计时器循环类似于这样:
DateTime endTime = DateTime.Now.AddMinutes(10);
while(endTime < DateTime.Now)
{
// Process loop
}
将Y分钟除以X间隔,得到需要运行的次数。然后只需计算函数被调用的次数即可。
在您的情况下,10分钟= 600秒/ 5秒= 需要120次调用。只需使用计数器跟踪函数被调用的次数即可。
在120个Ticks之后,执行Timer.Stop()
。
只需使用一个DateTime变量来跟踪何时应该结束,并在开始之前设置它。然后在您的Elapsed事件处理程序中,检查信号时间是否小于结束时间。如果不是,则停止计时器。
您可以计算函数将被调用的次数,并创建递减计数器。当计数器耗尽时,您可以取消订阅计时器滴答声。或者,您可以运行另一个计时器,其滴答周期为10分钟,每次滴答时取消订阅计时器并调用您的函数。
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;
}
注意开始时间。在每次调用中,测试是否 currentTime + 5 seconds > startTime + 10 minutes。如果是,则禁用计时器。
我更喜欢这种方法,而不仅仅是运行 N 次 ticks,因为不能保证计时器触发的时间与您想要的时间相同。可能会出现 120 次 ticks 运行超过实际世界时间的 10 分钟的情况。
您可以设置两个定时器,一个运行5秒钟,另一个运行10分钟,并禁用第一个定时器。