Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/csharp/334.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
C# 精确的三分钟时间间隔_C#_.net_Datetime_Timer - Fatal编程技术网

C# 精确的三分钟时间间隔

C# 精确的三分钟时间间隔,c#,.net,datetime,timer,C#,.net,Datetime,Timer,在我的报告中,我询问了将时间值四舍五入到最接近的第三分钟的问题。 现在我的System.Threading.Timer出现了一些问题,当第三分钟到来时,它必须工作。我谨此陈辞: private System.Timers.Timer WorkTimer; //... public void StartProccessing() { WorkTimer = new System.Timers.Timer(); WorkTimer.AutoReset = false; WorkTimer.Elaps

在我的报告中,我询问了将时间值四舍五入到最接近的第三分钟的问题。 现在我的System.Threading.Timer出现了一些问题,当第三分钟到来时,它必须工作。我谨此陈辞:

private System.Timers.Timer WorkTimer;
//...
public void StartProccessing()
{
WorkTimer = new System.Timers.Timer();
WorkTimer.AutoReset = false;
WorkTimer.Elapsed += new ElapsedEventHandler(WorkTimer_Elapsed);
StartWorkTimer();
}
//...
private void StartWorkTimer()
        {
            WorkTimer.Interval = (CurrentTime.AddMinutes(3) - DateTime.Now).TotalMilliseconds;
            WorkTimer.Start();
        }
void WorkTimer_Elapsed(object sender, ElapsedEventArgs e)
        {
            WorkTimer.Stop();
            this.ProcessData(this.CurrentTime);
            StartWorkTimer();
        }
问题是计时器启动时-它在前三分钟不工作,在第二个三分钟后开始工作。例如: 计时器在2012年2月15日12:20:32.871启动,在2012年2月15日12:21:00.000它必须工作计时器已过,但其开始时间为2012年2月15日12:24:01.871如何解决此问题? 我确定当前时间(从previos问题):


这里的问题是,你需要四舍五入到最接近的第三分钟,但是为了让计时器工作,你必须使用最近的一分钟

因此,如果删除
AddSeconds(30)
,则计时器应按预期工作


另一方面:取整算法应该增加90秒(因为这是3分钟的一半),而不是30秒。如果将30秒添加到12:31:50,那么最终将是12:30:00,但应该是12:33:00。

使用System.Threading.Timer类

DateTime dt = ... // here you assign the start time, so you can calculate
                  // the first time you want to start it.
var timer = new Timer(callback, null, dt, TimeSpan.FromMinutes(3));
回调是:

public delegate void TimerCallback(Object state)

在您的示例中,当PC上的时间被更正时,如何更正计时器间隔?您可以使用time changed event(时间更改事件)(当系统时间更改时触发)。但是,它只有在消息泵可用时才起作用(例如,它在windows服务中不起作用)。在这里阅读:为什么要加30秒?删除它应该会产生所需的结果。我添加30秒-请参阅我的previos问题
public delegate void TimerCallback(Object state)