我有一种方法可以进行一些计算。
public void CalculateItems()
{
// Calculate the empty Items
}
我需要每分钟 30秒执行一次。
如果我的服务从10:00:15开始,则该方法应从 10:00:30、10:01:00、10:01:30 开始工作,然后继续。
>如果我的服务在10:00:50开始,则该方法应从 10:01:00、10:01:30、10:02:00 开始工作,然后继续。
我已经尝试过System.Threading.Timer, System.Timers.Timer
,但在所有这些情况下,我都无法实现自己的方案。请帮助您提出宝贵的建议。
我尝试过的是在System.Threading.Timer中
var timer = new System.Threading.Timer(
e => CalculateItems(),
null,
TimeSpan.Zero,
TimeSpan.FromSeconds(30));
但是它达到了我的方法,每30秒,而不是每分钟 30秒
答案 0 :(得分:2)
使用计时器解决此问题的一种简单方法是将间隔设置为一秒,然后在计时器的回调方法中检查DateTime.Now.Seconds
的值是否除以30:
void Timer_Elapsed(object sender, ElapsedEventArgs e)
{
if(DateTime.Now.Seconds % 30 == 0)
{
CalculateItems();
}
}
答案 1 :(得分:1)
您可以最初以1秒的间隔启动计时器。然后,在计时器事件中,如果DateTime.Now.Second为30或0,则可以将间隔设置为30秒。从那时起,您的事件只会在指定的时间触发。
System.Timers.Timer timer= new System.Timers.Timer(1000);
private void OnTimedEvent(Object source, System.Timers.ElapsedEventArgs e)
{
if(timer.Interval!=30000 && DateTime.Now.Seconds % 30 == 0)
{
timer.Stop();
timer.Interval = 30000;
timer.Start();
DoWork();
}
else
{
if(timer.Interval==30000)
{
DoWork();
}
}
}
答案 2 :(得分:0)
我用计时器解决了这个问题,并计算了下30秒的Sime: 经过30秒后,它将重新计算,否则每次运行后都会稍微增加一个增量。
class Program
{
static System.Threading.Timer _ttimer;
static void Main(string[] args)
{
SetupTimerTo30sec();
Console.ReadLine();
}
private static void SetupTimerTo30sec()
{
var now = DateTime.Now;
int diffMilliseconds;
if (now.Second < 30)
{
diffMilliseconds = (30 - now.Second) * 1000;
}
else
{
diffMilliseconds = (60 - now.Second) * 1000;
}
diffMilliseconds -= now.Millisecond;
if (_ttimer != null)
{
_ttimer.Change(diffMilliseconds, 30 * 1000);
}
else
{
_ttimer = new Timer(OnElapsed, null, diffMilliseconds, 30 * 1000);
}
}
private static void OnElapsed(object state)
{
Console.Write(DateTime.Now.ToLongTimeString());
Console.WriteLine($":{DateTime.Now.Millisecond}");
SetupTimerTo30sec();
}
}