【发布时间】:2009-04-24 16:42:58
【问题描述】:
我需要每 5 秒运行一次函数,持续 10 分钟。
我使用计时器运行 5 秒,但如何将计时器限制为仅 10 分钟?
【问题讨论】:
我需要每 5 秒运行一次函数,持续 10 分钟。
我使用计时器运行 5 秒,但如何将计时器限制为仅 10 分钟?
【问题讨论】:
只需在 elapsed 处理程序中捕获您想要停止的时间并结束您的计时器。这是一个示例(注意:我使用了System.Threading.Timertimer。为您正在做的事情选择适当的计时器。例如,如果您在 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 次调用。只需让计数器记录您的函数被调用的次数。
【讨论】:
Timer.Stop() 在 120 个滴答声之后。
【讨论】:
只需使用 DateTime 变量来跟踪它应该何时结束并在开始之前设置它。在您的 Elapsed 事件处理程序上,检查信号时间是否小于结束时间。如果不是,请停止计时器。
【讨论】:
您可以计算您的函数将被调用的次数,并创建递减计数器,在您取消订阅计时器滴答之后。或者您可以运行另一个具有滴答周期的计时器 - 10 分钟,然后在滴答时取消订阅计时器滴答调用您的函数。
【讨论】:
注意开始时间。在每次通话中,测试 currentTime + 5 秒 > startTime + 10 分钟。如果是这样,请禁用计时器。
我更喜欢这种只运行 N 个滴答声的方法,因为定时器不能保证在您希望它们触发时触发。 120 个滴答声可能会运行 10 分钟的真实世界时间。
【讨论】:
您可以设置两个计时器,一个运行 5 秒,另一个运行 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;
}
【讨论】: