System.Timers.Timer问题!!急急

baidu_21030427 2014-09-22 09:57:46

foreach (XmlNode xnode in nodelist)
{
System.Timers.Timer taskTime= new System.Timers.Timer();
//动态创建的定时器,用来分别执行不同的任务,当然 每个定时器的间隔时间也是动态的
taskTime.Interval = ts.Days * (24 * 60 * 60) + ts.Hours * 60 * 60 + ts.Minutes * 60;
taskTime.Enabled = true;
taskTime.AutoReset = true;
taskTime.Elapsed += new System.Timers.ElapsedEventHandler(taskTime_Elapsed);
taskTime.Start();
}

//间隔时间执行的事件
void taskTime_Elapsed(object sender, System.Timers.ElapsedEventArgs e)
{
System.Timers.Timer t = (System.Timers.Timer)sender;
t.Stop();
/////////业务需求
/////////业务需求
//业务执行完成之后 我需要把这个定时器的间隔时间重新设置
t.AutoReset = true;
t.Interval = ts.Days * (24 * 60 * 60) + ts.Hours * 60 * 60 + ts.Minutes * 60;
t.Enabled = true;
t.Start();
}

为什么我到了间隔的时间会多次执行 taskTime_Elapsed ???
...全文
285 15 打赏 收藏 转发到动态 举报
写回复
用AI写文章
15 条回复
切换为时间正序
请发表友善的回复…
发表回复
於黾 2014-09-22
  • 打赏
  • 举报
回复
比如你想每天的17:00运行一次 2种办法 1.定时器每秒或每5秒执行一次,先取当前时间DataTime.Now 然后判断DataTime.Now.Hour和DataTime.Now.Minite 2.程序里不加timer,一开启就执行,执行完就退出 然后把程序加入任务计划里,每天定时启动它
於黾 2014-09-22
  • 打赏
  • 举报
回复
你这样设置,是不靠谱的做法,时间误差会越来越大 你应该在定时器里取本地时间,然后判断时间等于多少,就执行一次你的代码 当然要另加变量避免同一分钟内多次执行的问题
baidu_21030427 2014-09-22
  • 打赏
  • 举报
回复
引用 12 楼 Z65443344 的回复:
断点跟一下看taskTime.Interval 到底是什么,就能知道问题出在哪了
我设置定时器一天执行一次 是不是这样的 t.Interval=24*60*60*1000
於黾 2014-09-22
  • 打赏
  • 举报
回复
断点跟一下看taskTime.Interval 到底是什么,就能知道问题出在哪了
baidu_21030427 2014-09-22
  • 打赏
  • 举报
回复
引用 10 楼 Z65443344 的回复:
taskTime.Interval = ts.Days * (24 * 60 * 60) + ts.Hours * 60 * 60 + ts.Minutes * 60; ts是什么,你最终到底把它设置成什么了?
我这里确实没乘以1000。。。。ts是timespan 算出我间隔时间的
於黾 2014-09-22
  • 打赏
  • 举报
回复
taskTime.Interval = ts.Days * (24 * 60 * 60) + ts.Hours * 60 * 60 + ts.Minutes * 60; ts是什么,你最终到底把它设置成什么了?
gxingmin 2014-09-22
  • 打赏
  • 举报
回复
对,Interval还得乘以1000
gxingmin 2014-09-22
  • 打赏
  • 举报
回复
用taskTime.Enabled = true;就不需要taskTime.Start();了吧
Icedmilk 2014-09-22
  • 打赏
  • 举报
回复
Interval是以毫秒为单位的,你没有乘1000,所以你的ts变量被大大的缩短了,比如500秒变成了0.5秒,时间被频繁出发,所以你感觉出发了多次
引用 4 楼 baidu_21030427 的回复:
[quote=引用 1 楼 bdmh 的回复:] 因为你创建了多个timer,都绑定到一个事件中
而且我那里动态创建timer的代码 实际上只有一条测试数据!!应该只有一个timer创建了啊[/quote]
baidu_21030427 2014-09-22
  • 打赏
  • 举报
回复
引用 5 楼 gxingmin 的回复:
你循环里创建timer了,所以循环多少次,就创建了多少个timer
这里动态创建,实际上我只有一条测试数据, for循环里也只会进去一次。所以也只创建了一个timer
gxingmin 2014-09-22
  • 打赏
  • 举报
回复
你循环里创建timer了,所以循环多少次,就创建了多少个timer
baidu_21030427 2014-09-22
  • 打赏
  • 举报
回复
引用 1 楼 bdmh 的回复:
因为你创建了多个timer,都绑定到一个事件中
而且我那里动态创建timer的代码 实际上只有一条测试数据!!应该只有一个timer创建了啊
gxingmin 2014-09-22
  • 打赏
  • 举报
回复
System.Threading.Timer timer = new System.Thread.Timer( 
MyTimerCallback,    //定时回调函数 
 null,  
Timeout.Infinite,   
10*60*1000);

void MyTimerCallback(object o) 
{ 
   // (要定时执行的代码写在这里) 
   timer.Change(Timeout.Infinite, 60*10 *1000);   //<--每10分钟启动一次! ,可以改变下次启动时间
}
重新设置时间可以用Timer.Change方法,不用stop在start
baidu_21030427 2014-09-22
  • 打赏
  • 举报
回复
引用 1 楼 bdmh 的回复:
因为你创建了多个timer,都绑定到一个事件中
那我怎么做才能真正意义的创建多个timer呢?
bdmh 2014-09-22
  • 打赏
  • 举报
回复
因为你创建了多个timer,都绑定到一个事件中

110,570

社区成员

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

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

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