本帖最后由 wzp646011267 于 2014-01-17 09:48:28 编辑

解决方案 »

  1.   

    如果开关只有一个,那用timer(其实也是线程),比较好控制开关。里面还是用sleep
      

  2.   


    时间不一样不好用timer,
    一件事就就要用一个timer,太耗资源了,循环的 “事” 的数量 是不定的
      

  3.   

    而且我这个每件事都有可能里面含有timer的,因为要做跑马灯效果,我用的timer
      

  4.   

    先把其他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;
    }
    .....
      

  5.   


    这样的话我有多少事就要创建多少个timer,性能是个极大的消耗
      

  6.   

    现在是这样做的:
     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);
    代码写的很烂.... 见笑。
      

  7.   

    可以使用BackgroundWorker,在需要的时候,可以取消运行。
      

  8.   

    可以用Timer,不一定要每一件事用一个timer,可以把a,b,c,d均写在timer中,用sleep等待。
      

  9.   

    委托用begininvoke来开始运行,这样就能实现异步进行,不会出现程序阻塞(假死)情况
      

  10.   

    可否让循环和界面通过全局变量来交互呢?
    比如:
    线程中的循环,只修改一对全局变量的值。
    界面的onpaint事件,读取这些全局变量,显示对应界面。不知道同时操作同一个变量值时,是否会有冲突。
    求大牛解答。
      

  11.   

    用多个timer不是个好主意,timer要防止中间发生异常后重入的问题;
    这么低频的操作,把循环处理放在单线程中就可以;
    要想界面有响应,委托是少不了的;
    如果是多线程操作全局变量,锁是少不了的.
      

  12.   

    执行完一个执行完另一个?
    一个TIMER就行
      

  13.   

     不知道这样行不行,仅仅是个想法。   在做a的时候,设为1,
          b    2
          c    3
          d    4
       当为1时,也就是a的时间等待了30s便做b,b是为2,然后依此类推。这样行不行??
      

  14.   

    timer.interval=10000  (十秒钟)
      

  15.   

    单个timer触发,tick设为最小公约数。。比如楼上那样
      

  16.   

    你可以设计一个Schedule类型,例如有一个Datetime类型属性和一个方法,然后timer触发了相应事件之后,基本上就是这样处理var now = DateTime.Now;
    foreach (Schedule x in ScheduleList)
    {
        if (x.下次开始执行时间)
            ThreadPool.QueueUserWorkItem(h => x.Execute());
    }
      

  17.   

    这里,比较“难”的是知道要开发一个Schedule类型,来封装知识。程序设计师是干什么的?首先就应该是来设计这种Schedule类型的。如果一点不搞“设计”,那么往往就会越来越杯具地堆砌各种奇怪的代码。
      

  18.   

    嗯,代码改一下var now = DateTime.Now;
    foreach (Schedule x in ScheduleList)
    {
        if (x.下次开始执行时间 <= now)
            ThreadPool.QueueUserWorkItem(h => x.Execute());
    }
      

  19.   

    执行完一个执行完另一个?
    一个TIMER就行