WPF的定时器问题,急!!!

HXXCCC 2019-02-12 10:40:51

DispatcherTimer readDataTimer = new DispatcherTimer();
readDataTimer.Tick += new EventHandler(StartCost);
readDataTimer.Interval = new TimeSpan(1, 0, 0, 0);
readDataTimer.Start();


StartCost事件大概会执行2个小时。 我要实现的功能是隔一天执行一次。 但是他每次在我StartCost执行完之后才会开始计时1天,导致每天执行的时间一直往后推迟。 请问我这个是什么问题?
...全文
402 9 打赏 收藏 转发到动态 举报
写回复
用AI写文章
9 条回复
切换为时间正序
请发表友善的回复…
发表回复
xuzuning 2019-02-12
  • 打赏
  • 举报
回复
这与 StartCost 是怎么写的有关
HXXCCC 2019-02-12
  • 打赏
  • 举报
回复
引用 8 楼 xian_wwq 的回复:
DispatcherTimer定时器第一次执行是先等待指定周期的时间再执行定时器方法,而不是先执行再计时;然后执行完定时器方法后,再等待指定周期的时间。如:如执行周期T = 5s, 定时器方法内的代码所需执行时间为R = 4s;当启动定时器时:先等待5s,然后执行定时器方法(所需时间4s),然后再等待5s,再执行定时器方法(所需时间4s).........
所以程序这么执行是定时器特性决定的

建议换下思路
1. 如果要继续使用DispatcherTimer,修改周期判定逻辑。
虽然功能代码是隔天执行一次,
但是没有必要把interval设定为new TimeSpan(1, 0, 0, 0);
因为interval设定过长,启动和停止都不灵活
可以设定为小时级别或者分钟级别
在StartCost中进行时间间隔判定
比如

DateTime lastTime;//记录上一轮的执行时间

private void StartCost(object sender, EventArgs e)
{
DateTime currentTime = DateTime.Now;
TimeSpan s = currentTime - lastTime;
if(s.TotalHours > 48) /*2天执行一次*/
{
//耗时的工作代码

lastTime = DateTime.Now;
}

}



2. 更换定时器,使用System.Threading.Timer
当然DispatcherTimer有它的优势,它与UI交互不需要委托。


谢谢大佬,我用这个思路试试。
xian_wwq 2019-02-12
  • 打赏
  • 举报
回复
DispatcherTimer定时器第一次执行是先等待指定周期的时间再执行定时器方法,而不是先执行再计时;然后执行完定时器方法后,再等待指定周期的时间。如:如执行周期T = 5s, 定时器方法内的代码所需执行时间为R = 4s;当启动定时器时:先等待5s,然后执行定时器方法(所需时间4s),然后再等待5s,再执行定时器方法(所需时间4s).........
所以程序这么执行是定时器特性决定的

建议换下思路
1. 如果要继续使用DispatcherTimer,修改周期判定逻辑。
虽然功能代码是隔天执行一次,
但是没有必要把interval设定为new TimeSpan(1, 0, 0, 0);
因为interval设定过长,启动和停止都不灵活
可以设定为小时级别或者分钟级别
在StartCost中进行时间间隔判定
比如

DateTime lastTime;//记录上一轮的执行时间

private void StartCost(object sender, EventArgs e)
{
DateTime currentTime = DateTime.Now;
TimeSpan s = currentTime - lastTime;
if(s.TotalHours > 48) /*2天执行一次*/
{
//耗时的工作代码

lastTime = DateTime.Now;
}

}



2. 更换定时器,使用System.Threading.Timer
当然DispatcherTimer有它的优势,它与UI交互不需要委托。

loveljy_19901114 2019-02-12
  • 打赏
  • 举报
回复
startcost写成一个异步Task,这样就不占用主线程时间了,或者使用quartz框架的.net版本每天定点执行
kenfinal 2019-02-12
  • 打赏
  • 举报
回复
定时器里面的是时间间隔,所以运行完才会继续计时。你在定时任务里启动一个异步任务不就好了?或者实时使用第三方的任务调度库
xuzuning 2019-02-12
  • 打赏
  • 举报
回复
要看到你 StartCost 方法是怎么写的,不然怎么帮你?
  • 打赏
  • 举报
回复
尝试StartCost 方法中的代码异步执行
灵感源于生活 2019-02-12
  • 打赏
  • 举报
回复
以上是我的同步程序。 根据Oracle的分类从mongdb中读取,写入另一个Mongdb中。每天执行一次,执行的时间从配置文件中读取的。
HXXCCC 2019-02-12
  • 打赏
  • 举报
回复
引用 1 楼 xuzuning 的回复:
这与 StartCost 是怎么写的有关


这里面是数据量比较大的数据库查询与存储。
有什么方法可以解决吗

110,535

社区成员

发帖
与我相关
我的任务
社区描述
.NET技术 C#
社区管理员
  • C#
  • Web++
  • by_封爱
加入社区
  • 近7日
  • 近30日
  • 至今
社区公告

让您成为最强悍的C#开发者

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