Asp.net 时间漂移。。。。。。。。。。。。

hwj383 2009-09-18 04:35:50
Asp.net 时间漂移
-_-!!!

------------------------------------我是华丽丽的分隔线---------------------------------

描述:一定时间执行一个[时间任务]

如:每隔 1 小时 执行 从 01:00 到 02:00 ,下次就是02:01 到 03:00 记日志

间隔执行时间 [每隔一小时]

取值时间范围 [01:00 到 02:00]

一句话就是一段时间执行确[ 当前时间 减去 一段时间 ]

------------------------------------我是华丽丽的分隔线---------------------------------

伪代码:

位置 A: ...代码....

位置 B: {
string now = DateTime.Now.ToString("yyyy-MM-dd hh:mm");
Save();//操作,假设耗时5s
}

位置 C: 保存上次更新时间now

解法1: 下次直接取 上次保存的 now 和 系统当前时间 做为范围。
问题:丢取值时间范围数据 假设上次是 10:00 下次不会是 11:00,而可能是11:02,因为 位置A要耗时

解法2: 当前值不再是 系统时间,而是 上次更新时间 + 间隔时间 (不考虑失败的情部况)。这样没有丢数据的危险。可是:假设开始时间是 11:00 代码执行到 B 位置 可能时间11:02 ,再下次可能是12:04秒,几天或者几月后,可能存在今天的日期却在调用昨天的日期范围数据。时间漂移?-_-!!![标题党!]

------------------------------------我是华丽丽的分隔线---------------------------------

我的逻辑是否正确?如果正确期待第3种解法,第N种解法
------------------------------------我是华丽丽的分隔线---------------------------------

谢谢


...全文
126 13 打赏 收藏 转发到动态 举报
写回复
用AI写文章
13 条回复
切换为时间正序
请发表友善的回复…
发表回复
小凤雏 2009-09-20
  • 打赏
  • 举报
回复
兄弟,你是要做日志备份吗?这样的话你可以参考银行系统的实时备份策略,如果系统对时间要求比较严格的话..
mq 2009-09-20
  • 打赏
  • 举报
回复
[Quote=引用 11 楼 sp1234 的回复:]
你的顾虑真是累死个人了。

与其如此,不如你的定时器,每隔几秒钟启动一次,在每一次启动中判断是否已经距离上次记录时间过去了1个小时,如果过去了就立即开始处理。这样免得玩那么复杂的设计游戏。

一些人可能纠缠于1小时1次的定时器要比5秒钟一次的定时器更加“少占用CPU时间”。我们只需要判断这个几秒钟一次的定时器控制(仅仅是简单读取一个参数再判断一下只时间差而已)是否对系统价值造成了几毛钱影响?!如果没有什么实质影响,就不必纠缠于它。
[/Quote]
同意这个观点,关键看你的要求是什么样的,有些东西当然要忽略掉的。
  • 打赏
  • 举报
回复
你的顾虑真是累死个人了。

与其如此,不如你的定时器,每隔几秒钟启动一次,在每一次启动中判断是否已经距离上次记录时间过去了1个小时,如果过去了就立即开始处理。这样免得玩那么复杂的设计游戏。

一些人可能纠缠于1小时1次的定时器要比5秒钟一次的定时器更加“少占用CPU时间”。我们只需要判断这个几秒钟一次的定时器控制(仅仅是简单读取一个参数再判断一下只时间差而已)是否对系统价值造成了几毛钱影响?!如果没有什么实质影响,就不必纠缠于它。
刘小辉同学 2009-09-20
  • 打赏
  • 举报
回复
如果你是在C#.Net里作Window类的程序还可以这么做.
如果你是Aps.Net做在页面上是不行的.
cat_hsfz 2009-09-19
  • 打赏
  • 举报
回复
关键是你用什么做定时器?System.Threading.Timer?

如果你把Timer设置为每小时触发一次,那么无论触发后你消耗了多少时间在干活,只要这个时间不超过1小时,下一次的触发仍然是准点的。

或者你可以不设置每小时触发,只设置下一次的触发时间。例如说,这次触发是10:00,干活完毕是10:02,那么你就重设Timer为58分钟后触发,也就是误差不累加,这就解决问题了。
wuyi8808 2009-09-19
  • 打赏
  • 举报
回复
up
  • 打赏
  • 举报
回复
有人要我也设计这种定时执行,正在考虑中
SK_Aqi 2009-09-18
  • 打赏
  • 举报
回复
执行完记录log不就行了,减掉前面时间
fengjian_428 2009-09-18
  • 打赏
  • 举报
回复
如果你想省事省心
可以考虑使用quartz 一个开源的作业调度框架
fengjian_428 2009-09-18
  • 打赏
  • 举报
回复
string now = DateTime.Now.ToString("yyyy-MM-dd hh:mm");
不能放到最上面?
mngzilin 2009-09-18
  • 打赏
  • 举报
回复
迷糊,顶一下
「已注销」 2009-09-18
  • 打赏
  • 举报
回复
位置 B: {
解法1:string now = DateTime.Now.ToString("yyyy-MM-dd hh:mm");
解法2:string now = 上次更新时间 + 更新间隔

Save();//操作,假设耗时5s
}
ban83102 2009-09-18
  • 打赏
  • 举报
回复
不会,帮你顶一下

62,025

社区成员

发帖
与我相关
我的任务
社区描述
.NET技术交流专区
javascript云原生 企业社区
社区管理员
  • ASP.NET
  • .Net开发者社区
  • R小R
加入社区
  • 近7日
  • 近30日
  • 至今
社区公告

.NET 社区是一个围绕开源 .NET 的开放、热情、创新、包容的技术社区。社区致力于为广大 .NET 爱好者提供一个良好的知识共享、协同互助的 .NET 技术交流环境。我们尊重不同意见,支持健康理性的辩论和互动,反对歧视和攻击。

希望和大家一起共同营造一个活跃、友好的社区氛围。

试试用AI创作助手写篇文章吧