private void s() //(1)
{
  if(t())
  {...}
}private bool t()
{
  System.Timers.Timer timer1 = new System.Timers.Timer(10000);
  timer1.AutoReset = true;
  timer1.Elapsed += new ElapsedEventHandler(timer1_Elapsed);
  timer1.Enabled = true; //(2)
  if (timer1.Enabled == false) //(3)
  {
     return true;
  }
}void timer1_Elapsed(object sender, ElapsedEventArgs e) //(4)
{
  //只做延时用
  timer1.Enabled = false;
}
上面的代码从(1)开始,函数t()一定要是bool型的,timer1是做延时用的,本来想用sleep,但是整个程序都死,不符合要求.现在我想启动timer1后就进入到timer1_Elapsed,然后再执行(3),也就是说从(2)到(4),(4)执行完后再执行(3),请问要怎么做?

解决方案 »

  1.   

    不一定非要用timer,其他方法也可以
      

  2.   

    晕....
    简单说就是在执行private bool t() 得过程中,加入一个延时,延时结束(就是timer1.Enabled == false)后return true
      

  3.   

    晕....
    简单说就是在执行private bool t() 得过程中,加入一个延时,延时结束(就是timer1.Enabled == false)后return true
      

  4.   

    你做这个延时的目的是什么?如果你是想让UI不阻塞的话,那么非要用多线程,把方法
    private void s() //(1) 

      if(t()) 
      {...} 

    放到另外一个线程中去执行
    再如果一次,如果你用多线程的话推荐使用组件backgroundWorker
      

  5.   

    用两个TIMTER ,第一个用于延时,第二个用于延时后的处理。
      

  6.   

    回复10楼:
        1.延时的目的就是为了等待timer1_Elapsed返回一个标志(timer1.Enabled = false),然后好继续执行(3)。
        2.开线程是没有必要的,而且不适合
      

  7.   

    我把程序改一下,这样应该会看得等明白吧
    private void s() //(1) 

      if(t()) 
      {...} 
    } private bool t() 

      System.Timers.Timer timer1 = new System.Timers.Timer(10000); 
      timer1.AutoReset = true; 
      timer1.Elapsed += new ElapsedEventHandler(timer1_Elapsed); 
      timer1.Enabled = true; //(2) 
      while(timer1.Enabled ) //(3)
      {
         //什么都不执行,就在等timer1.Enabled=false退出循环,然后好return true。
          //其实这个循环就是为了等待10秒,在这10秒会有数据自动来,代码太多而且涉及很多类,我就没贴出来,就用
          //最后要执行的语句return true来代替了。
      } 
      return true; 
    } void timer1_Elapsed(object sender, ElapsedEventArgs e) //(4) 

      //只做延时用 
      timer1.Enabled = false; 
    } 我想做的是把(3)那个while循环去掉(因为它占资源,我要开很多调用上述代码的线程的),但还能起到延时执行return true的效果。不能用sleep,在延时期间还有很多事要做的。
      

  8.   

    回复11楼:2个TIMTER 不行吧,第二个TIMTER所做的延时后的处理是一定要放在private bool t() 
    里的,因为要return true
      

  9.   

    你这个非开线程不行,你的想法我知道,我以前也是你这样做的,总觉得用timer可是实现多线程的效果,实际上是不可能的在你去延时等待的10s和这个要执行10s的工作,是循序执行过来的,中间一样会觉得卡一下用多线程实现简单的功能不麻烦,特别是使用backgroundWorker组件,耐心看完msdn上面关于backgroundWorker组件的资料你要的答案用timer这个方法肯定行不通,我可以打包票
    对backgroundWorker组件讲解很好http://www.cnblogs.com/happy555/archive/2007/11/07/952315.html
      

  10.   

    回复sl2161:你说的backgroundWorker我看了,可是没理解怎么来延时,请指教
      

  11.   

    定义DateTime变量,记下backgroundWorker启动时间,在DoWork中读取最新时间,看最新时间与启动时间的时间差是否大于你需要延时的时间
      

  12.   

    你把(3)放到DoWork事件中去执行,你说的延时可以放在timer里面我一直没有明白你要延时干什么,按照你提问里面说的延时是想在延时这段时间去做其他的事情,实际上多线程里面的话,不需要延时这个说法,你只需要在主线程也就是用户界面里面显示说"正在读取数据……或者正在执行某某操作请等待……",等待(3)执行完之后backgroundWorker会触发RunWorkerCompleted,在RunWorkerCompleted事件中写代码继续你(3)之后的操作一个问题:
    你是不是想防止界面像死机一样,是不是想在那个延时里面进行提示,告诉用户目前没有死机,是在执行,需要等待?
      

  13.   

        实际上做延时就是为了等待接收数据,我要同时开十到几十个进行同样操作的线程,如果每个都sleep 30秒的话,那么加起来的时间就太久了,至于死机倒是次要的。
        函数bool t() 是一定要返回true或false的,如果把3之后的操作放在RunWorkerCompleted事件中,那就没办法保证bool t() 有返回值了啊
      

  14.   

    你那个延时是真正的延时,在延时那会儿程序不会做任何事情,既然你不怕界面像死机一样,干嘛做一个延时呢在timer的事件中等待10s,程序的其他部分不会做任何事
      

  15.   

    我是不怕界面死,但是怕程序都等待,我说过我要开很多这样的线程,每个延时10s,那么60个就要延时10min,我就是想让他们互不干扰的延时,所以才采用timer。
    一个问题:在执行完DoWork之后程序就直接跳到RunWorkerCompleted了,这样延时的效果并没有体现出来,要怎么做?
      

  16.   

    刚刚发现backgroundWorker不能在类里写,在其他命名空间里有没有?
      

  17.   

    可以使用报告backgroundWorker中还有另外一个事件