如何利用Timer实现多个任务重复执行?

zhubo006 2010-11-23 10:19:21
如题,可能描述的不专业

应用场景是这样:有一个后台服务,要实现每隔20秒执行任务1,每隔30秒执行任务2,每隔15秒执行任务3。。。。。,
任务不固定,根据配置文件中的参数确定执行哪些任务任务。


现在我是从配置文件中读参数,有几个任务就new几个Timer,每个Timer只执行一个任务。
我想改进一下,只new一个Timer:将timer的Interval设为1秒,new很多Int变量,然后在timer_Elapsed中让它们递增,
判断,执行对应的任务;但问题在于timer_Elapsed没法根据配置文件自动调整。

各位高手有没有碰到过类似情况,请不吝指教。
...全文
956 15 打赏 收藏 转发到动态 举报
AI 作业
写回复
用AI写文章
15 条回复
切换为时间正序
请发表友善的回复…
发表回复
绿色夹克衫 2010-11-23
  • 打赏
  • 举报
回复
我觉得LZ用1个Timer的思路是可行的,这类的任务池我也是这么做的,用个优先队列,每秒检查一下队列顶的元素是否到时间该执行了,消耗不大。
zhubo006 2010-11-23
  • 打赏
  • 举报
回复
[Quote=引用 11 楼 sp1234 的回复:]

找一个会抄别人代码的程序员很容易。当你需要修改程序代码的时候,我们就发现基础知识多么重要了,基础知识好的人可以将概念建模,即使需要另外进行概念建模也能立刻看出来,他可以自己推演这种逻辑,从分析到编程的角色转换时可以做到言行一致而不疑惑。
[/Quote]

呵呵,受教了。
gohappy2008 2010-11-23
  • 打赏
  • 举报
回复
可以采用线程
  • 打赏
  • 举报
回复
找一个会抄别人代码的程序员很容易。当你需要修改程序代码的时候,我们就发现基础知识多么重要了,基础知识好的人可以将概念建模,即使需要另外进行概念建模也能立刻看出来,他可以自己推演这种逻辑,从分析到编程的角色转换时可以做到言行一致而不疑惑。
  • 打赏
  • 举报
回复
哦,执行程序时可以到列表上去更新自己的执行时间记录,例如
foreach(var task in 任务列表)
if(task.最后一次被执行时间.AddSeconds(task.几秒执行一次)<=DateTime.Now)
{
task.最后一次被执行的时间=DateTime.Now;
task.程序();
}
  • 打赏
  • 举报
回复
嗯,虽然许多人夸java,但是我们招聘的java程序员大多比.net程序员知识少一些。

“任务”是什么,你先要把自己的语言找到编程的对应物,这样才能言行一致地设计程序,否则就成了说一套做一套。我不知道你的任务是什么,可以做个假设:
public class Task
{
public int 几秒执行一次=10;
public ThreadStart 程序;
public DateTime 最有一次被执行的时间;
}


那么你也就是需要在程序开始执行时去填充这样的列表:
public static List<Task> 任务列表=new List<Task>();
。这里跟线程没有关系,线程所执行的具体方法(ThreadStart)才是你需要的。

然后就可以在你1秒钟一次的Timer触发的事件中去遍历这个“任务列表”队列,例如说:
foreach(var task in 任务列表)
if(task.最后一次被执行时间.AddSeconds(task.几秒执行一次)<=DateTime.Now)
task.程序();
viena 2010-11-23
  • 打赏
  • 举报
回复
[Quote=引用 7 楼 zhubo006 的回复:]
以前用Java写服务,是这样的。继承一个Thread类,实现timer的功能,一个任务就new一个Thread。
C#中thread是sealed的,没法继承。用Timer就想充分利用起来,呵呵
[/Quote]
感觉你的思维有点僵化~
zhubo006 2010-11-23
  • 打赏
  • 举报
回复
[Quote=引用 3 楼 viena 的回复:]

引用楼主 zhubo006 的回复:
现在我是从配置文件中读参数,有几个任务就new几个Timer,每个Timer只执行一个任务。
我想改进一下……


这样是对的
用一个Timer不觉得是改进
[/Quote]

以前用Java写服务,是这样的。继承一个Thread类,实现timer的功能,一个任务就new一个Thread。
C#中thread是sealed的,没法继承。用Timer就想充分利用起来,呵呵
viena 2010-11-23
  • 打赏
  • 举报
回复
只new一个Timer有什么好处呢?
搞不懂你怎么想的
感觉只用一个Timer只会增加逻辑复杂度,减少可维护性
并且运行时间间隔肯定是缩短了,增加了本来没必要的判断~
ztenv 2010-11-23
  • 打赏
  • 举报
回复
应该有一个任务接口,任务接口中有一个测试是否可以执行任务的方法,还有一个执行任务的方法,这样timer中无须知道任务几秒执行,只须调用任务是否可以执行方法,如果为真则执行任务,否则继承其它的任务,当然,timer的执行间隔为1秒;这样应该就解决了你的问题;
zhubo006 2010-11-23
  • 打赏
  • 举报
回复
[Quote=引用 2 楼 bdmh 的回复:]

啥叫自动调整呢,你可以搞个线程,不停地读取最新设置
[/Quote]

就是1楼的函数,但有几个if一开始是不知道的,要从配置文件中读取
就是函数体要动态生成,可能用词不当
viena 2010-11-23
  • 打赏
  • 举报
回复
[Quote=引用楼主 zhubo006 的回复:]
现在我是从配置文件中读参数,有几个任务就new几个Timer,每个Timer只执行一个任务。
我想改进一下……
[/Quote]

这样是对的
用一个Timer不觉得是改进
bdmh 2010-11-23
  • 打赏
  • 举报
回复
啥叫自动调整呢,你可以搞个线程,不停地读取最新设置
sprc_lcl 2010-11-23
  • 打赏
  • 举报
回复
int tcount = 0;

timer_tick内
{
tcount ++;
if(tcount % 20 == 0) //执行一
if(tcount % 30 == 0) //执行二
....
}

111,093

社区成员

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

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

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