C# 新分钟开始时运行的方法
我有一个每分钟都在运行的函数:C# 新分钟开始时运行的方法,c#,timer,C#,Timer,我有一个每分钟都在运行的函数: var waitHandle = new AutoResetEvent(false); ThreadPool.RegisterWaitForSingleObject( waitHandle, // Method to execute (state, timeout) => { Console.WriteLine(DateTime.Now + " START"); ..some stuff
var waitHandle = new AutoResetEvent(false);
ThreadPool.RegisterWaitForSingleObject(
waitHandle,
// Method to execute
(state, timeout) =>
{
Console.WriteLine(DateTime.Now + " START");
..some stuff
Console.WriteLine(DateTime.Now + " END");
},
null,
TimeSpan.FromMinutes(1),
false
);
此代码执行良好,但示例输出为:
2016-08-16 18:45:55 START
2016-08-16 18:45:55 END
2016-08-16 18:46:55 START
2016-08-16 18:46:55 END
(或在呼叫时正好在哪一秒)
我希望它像这样运行:
2016-08-16 18:45:00 START
2016-08-16 18:45:00 END
2016-08-16 18:46:00 START
2016-08-16 18:46:00 END
所以我希望这个函数每分钟运行一次,但是当秒数为0时。我该怎么做呢?显然,问题是必须添加到代码中的初始偏移量。根据serhiyb链接的问题的第二个答案,可以轻松完成:
void Register(AutoResetEvent waitHandle, TimeSpan timeout,
WaitOrTimerCallback callback, bool once)
{
ThreadPool.RegisterWaitForSingleObject(waitHandle, callback, null, timeout, once);
}
void Callback(object state, bool isTimeout)
{
Console.WriteLine(DateTime.Now + " START");
//..some stuff
Console.WriteLine(DateTime.Now + " END");
}
然后:
var waitHandle = new AutoResetEvent(false);
Register(
waitHandle,
TimeSpan.FromSeconds(60 - DateTime.Now.Second), //initial offset
(state, isTimeout) =>
{
Callback(state, isTimeout);
Register(waitHandle, TimeSpan.FromMinutes(1), Callback, false);
},
true);
@serhiyb-我想知道是否有一种方法可以编辑我的代码和RegisterWaitForSingleObject方法来做同样的事情你的问题可以让你清楚你想要什么,为什么你的解决方案不适合你。现在代码有什么问题吗?@Mikemcaughan我编辑过它