c#定时任务

wzp646011267 2014-01-17 09:45:55
现在我有个winform的界面,需要根据一个循环做一堆事:
a 做完之后,刷新界面,等待30s,做b
b 做完之后,刷新界面,等待60s,做c
c 做完之后,刷新界面,等待40s,做d
d 做完之后,刷新界面,等待60s,做a,循环进行,直到界面发送停止信号,

等待的时候不能让页面假死,这种怎么做?


我现在的做法是 :另外起一个线程来处理这一堆事情,做一件之后sleep,并且用一个委托来Invoke界面。
不知道有没有其他好的思路,分享下
...全文
441 22 打赏 收藏 转发到动态 举报
写回复
用AI写文章
22 条回复
切换为时间正序
请发表友善的回复…
发表回复
天空丶蒋 2014-01-18
  • 打赏
  • 举报
回复
不知道这样行不行,仅仅是个想法。 在做a的时候,设为1, b 2 c 3 d 4 当为1时,也就是a的时间等待了30s便做b,b是为2,然后依此类推。这样行不行??
  • 打赏
  • 举报
回复
嗯,代码改一下
var now = DateTime.Now;
foreach (Schedule x in ScheduleList)
{
    if (x.下次开始执行时间 <= now)
        ThreadPool.QueueUserWorkItem(h => x.Execute());
}
  • 打赏
  • 举报
回复
这里,比较“难”的是知道要开发一个Schedule类型,来封装知识。 程序设计师是干什么的?首先就应该是来设计这种Schedule类型的。 如果一点不搞“设计”,那么往往就会越来越杯具地堆砌各种奇怪的代码。
  • 打赏
  • 举报
回复
你可以设计一个Schedule类型,例如有一个Datetime类型属性和一个方法,然后timer触发了相应事件之后,基本上就是这样处理
var now = DateTime.Now;
foreach (Schedule x in ScheduleList)
{
    if (x.下次开始执行时间)
        ThreadPool.QueueUserWorkItem(h => x.Execute());
}
Conmajia 2014-01-18
  • 打赏
  • 举报
回复
单个timer触发,tick设为最小公约数。。比如楼上那样。。。
  • 打赏
  • 举报
回复
timer.interval=10000 (十秒钟)
会笑的苦瓜 2014-01-18
  • 打赏
  • 举报
回复
执行完一个执行完另一个? 一个TIMER。。。就行
小猪八Q 2014-01-17
  • 打赏
  • 举报
回复
可以使用BackgroundWorker,在需要的时候,可以取消运行。
wzp646011267 2014-01-17
  • 打赏
  • 举报
回复
现在是这样做的:
 private void MultiSubject(object obj)
        {
            var dt = (DataTable)obj;
            for (int i = 0; i < dt.Rows.Count; i++)
            {
                var textValue = dt.Rows[i]["Text"].ToString();
                var duration = int.Parse(dt.Rows[i]["Duration"].ToString());//时间
                var watch = new Stopwatch();
                watch.Start();
                Action fp = () => CycleDrawSubject(textValue);
                if (readOnlyRichTextBox.IsHandleCreated)
                    readOnlyRichTextBox.Invoke(fp);
                int time = (duration - Convert.ToInt32(watch.ElapsedMilliseconds));
                if (time > 0)
                {
                    Thread.Sleep(time);
                }
                watch.Restart();
                //重复执行
                if (i == dt.Rows.Count - 1)
                {
                    i = 0;
                }
            }
        }
调用处:
   var t = new Thread(MultiSubject);
                t.Start(dt);
代码写的很烂.... 见笑。
无常名 2014-01-17
  • 打赏
  • 举报
回复
只知道另开线程,帮顶!
wzp646011267 2014-01-17
  • 打赏
  • 举报
回复
引用 5 楼 human_2000 的回复:
先把其他timer设置为enable=false timera_tick() { timera.enble=false; //做a的事情 ,注意如果时间长,多掉一下applicaiton.doevents(),这样界面不会死 timerb.interval=30 timerb.enable=true; } timerb_tick() { timerb.enble=false; //做b的事情 ,注意如果时间长,多掉一下applicaiton.doevents(),这样界面不会死 timerc.interval=60 timerc.enable=true; } .....
这样的话我有多少事就要创建多少个timer,性能是个极大的消耗
human_2000 2014-01-17
  • 打赏
  • 举报
回复
先把其他timer设置为enable=false timera_tick() { timera.enble=false; //做a的事情 ,注意如果时间长,多掉一下applicaiton.doevents(),这样界面不会死 timerb.interval=30 timerb.enable=true; } timerb_tick() { timerb.enble=false; //做b的事情 ,注意如果时间长,多掉一下applicaiton.doevents(),这样界面不会死 timerc.interval=60 timerc.enable=true; } .....
wzp646011267 2014-01-17
  • 打赏
  • 举报
回复
而且我这个每件事都有可能里面含有timer的,因为要做跑马灯效果,我用的timer
wzp646011267 2014-01-17
  • 打赏
  • 举报
回复
引用 2 楼 scm_2008 的回复:
如果开关只有一个,那用timer(其实也是线程),比较好控制开关。里面还是用sleep
时间不一样不好用timer, 一件事就就要用一个timer,太耗资源了,循环的 “事” 的数量 是不定的
天罡gg 2014-01-17
  • 打赏
  • 举报
回复
如果开关只有一个,那用timer(其实也是线程),比较好控制开关。里面还是用sleep
bdmh 2014-01-17
  • 打赏
  • 举报
回复
这就行了,不卡界面就用线程
迷迷520 2014-01-17
  • 打赏
  • 举报
回复
执行完一个执行完另一个? 一个TIMER。。。就行
xian_wwq 2014-01-17
  • 打赏
  • 举报
回复
用多个timer不是个好主意,timer要防止中间发生异常后重入的问题; 这么低频的操作,把循环处理放在单线程中就可以; 要想界面有响应,委托是少不了的; 如果是多线程操作全局变量,锁是少不了的.
APM60- 2014-01-17
  • 打赏
  • 举报
回复
可否让循环和界面通过全局变量来交互呢? 比如: 线程中的循环,只修改一对全局变量的值。 界面的onpaint事件,读取这些全局变量,显示对应界面。 不知道同时操作同一个变量值时,是否会有冲突。 求大牛解答。
  • 打赏
  • 举报
回复
委托用begininvoke来开始运行,这样就能实现异步进行,不会出现程序阻塞(假死)情况
加载更多回复(1)

110,538

社区成员

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

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

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