线程睡眠/等到新的一天

fin*_*ook 12 c# datetime multithreading thread-sleep

我正在循环中运行一个进程,它对每天的操作数量有限制.当它达到这个限制时,我现在已经检查了循环中的时间,看它是否是一个新的日期.

最好的选择是:

  • 继续检查新日期的每秒时间
  • 计算直到午夜的秒数并睡眠那段时间
  • 别的什么?

Dan*_*ert 16

不要将Thread.Sleep用于此类事情.使用计时器并计算您需要等待的持续时间.

var now = DateTime.Now;
var tomorrow = now.AddDays(1);
var durationUntilMidnight = tomorrow.Date - now;

var t = new Timer(o=>{/* Do work*/}, null, TimeSpan.Zero, durationUntilMidnight);
Run Code Online (Sandbox Code Playgroud)

将代理替换为/* Do Work */将以指定的时间间隔恢复工作的回调.

编辑:如评论中所述,如果您假设应用程序将等待的"已用时间"与实际时间匹配,则可能会出现许多问题.因此,如果时间对您很重要,最好使用较小的轮询间隔来确定时钟是否已达到您希望工作发生的时间.

更好的方法是使用Windows任务计划程序在所需的时间运行您的任务.这比尝试在代码中自己实现它要可靠得多.

  • 我建议将定时器间隔设置为比直到午夜的毫秒数更频繁的数量.(如果有时间变化怎么办?等等,如果按UTC去,时钟永远不会改变,可能不是问题). (2认同)

P.B*_*key 7

Windows有一个任务调度程序,可以完全处理这个任务.创建程序以执行它应该执行的操作.然后将其设置为计划任务.