页面上有一个label1,timer1,代码如下:private void timer1_Tick_1(object sender, EventArgs e)  //timer1的tick事件
        {
            if (i == 1)
            {
                timer1.Stop();
            }
            else
            {
                Thread t = new Thread(new ThreadStart(TimerStart));  //这里是线程
                t.Start();
            }
            i++;
        }        public void TimerStart()
        {
            label1.Text = "maopian  jijiang kaishi " + DateTime.Now.ToString("yyyy-MM-dd HH:mm:ss");
        } private void Form1_Load(object sender, EventArgs e)  //加载事件
        {
            timer1.Start();
            System.Windows.Forms.Control.CheckForIllegalCrossThreadCalls = false;}
PS:现在的条件是执行完一次后,timer1必须停住,那么我在通过什么方式可以在以后每隔10s后再次启动timer1呢???想的头都大了,希望大神显灵!

解决方案 »

  1.   

    这是什么命名空间下的 timer ,设置 timer 的间隔为 10s,没必要在执行的方法里 stop 它。
      

  2.   


    System.Windows.Forms.Control.CheckForIllegalCrossThreadCalls = false;不建议使用这种方法,还有,为什么不把timer1的间隔设置成10s呢
      

  3.   


    就是在工具箱中拖出来的一个timer,应该是System.Form下的吧!我已经用红色的标出了timer必须stop,这个是我写的测试代码,因为真正的程序里需要stop它!
      

  4.   


    因为我后面用了线程了,所以必须的加上这个,否则会报错的!timer1里面本身就在控制线程thread,真正的程序里必须停止掉timer,这里的只是我写的demo!我的demo是希望能够在timer控制下的线程执行完某个操作停止后,通过什么方法再次启动!PS:如果我在页面是丢个button,正常启动!
      

  5.   

    另外添加一个Timer,设置Interval,用来读取原来的timer是否已经停止,如果已经停止,则启动原来的timer
      

  6.   

    timer1_Tick_1 只是执行第一次时 stop ,之后再执行就不要 stop 了?
    如果是这样,首先设置间隔 10s ,再在 i++ 之前加上
    if (i == 1)
    {
        timer1.Start();
    }
    处理部分就加在上面的 if 语句之前。
      

  7.   

    计时器间隔设置 10s
    timer1_Tick_1 方法里 if 判断去掉,i 这个变量也不要,第一行就是 timer1.Stop(); 
    TimerStart 方法最后一行加上 timer1.Start(); 
    这样就是计时器到点触发后就先关闭计时器,启动线程做你的工作,工作完成后开启计时器,等 10s 又再触发计时器方法,再关闭计时器,开始处理工作,循环这样,不知是不是你要的效果?
      

  8.   

    改成这样就好了嘛:private void timer1_Tick_1(object sender, EventArgs e)  //timer1的tick事件
            {
                try
                {
                    if (i == 1)
                    {
                        return;
                        //timer1.Stop();
                    }
                    else
                    {
                        Thread t = new Thread(new ThreadStart(TimerStart)); //这里是线程
                        t.Start();
                    }
                }
                finally
                {
                    i++;
                }
            }        public void TimerStart()
            {
                this.BeginInvoke(
                    new Action(
                        () =>
                        {
                            label1.Text = "maopian  jijiang kaishi " + DateTime.Now.ToString("yyyy-MM-dd HH:mm:ss");
                        }));
                //label1.Text = "maopian  jijiang kaishi " + DateTime.Now.ToString("yyyy-MM-dd HH:mm:ss");
            }        private void Form1_Load(object sender, EventArgs e)  //加载事件
            {
                timer1.Start();
                System.Windows.Forms.Control.CheckForIllegalCrossThreadCalls = false;        }PS:这段代码
    else
                    {
                        Thread t = new Thread(new ThreadStart(TimerStart)); //这里是线程
                        t.Start();
                    }其实是没有必要的,直接这样 else
                    {
                        label1.Text = "maopian  jijiang kaishi " + DateTime.Now.ToString("yyyy-MM-dd HH:mm:ss");
                        //Thread t = new Thread(new ThreadStart(TimerStart)); //这里是线程
                        //t.Start();
                    }应该就可以了嘛
      

  9.   

    就是说你在stop的时候不stop它,只是把方法return,不执行代码就OK啦
      

  10.   

    可以在线程方法(例子中的TimerStart())执行完毕后重置timer控件,设置间隔为10S,然后启动timer控件。。System.Windows.Forms.Timer控件在启动时是不执行Tick事件的,在Interval指定时间到时后才会执行Tick事件例如你上边的demo:
    public void TimerStart()
            {
                label1.Text = "maopian  jijiang kaishi " + DateTime.Now.ToString("yyyy-MM-dd HH:mm:ss");
                timer1.Start();
            }ps:label1.Text = "maopian  jijiang kaishi "
    字符串的中文翻译是不是:毛片即将开始
      

  11.   

    private void timer1_Tick_1(object sender, EventArgs e)  //timer1的tick事件
    {
        timer1.Stop();    Thread t = new Thread(new ThreadStart(TimerStart));  //这里是线程
        t.Start();
    }public void TimerStart()
    {
        label1.Text = "maopian  jijiang kaishi " + DateTime.Now.ToString("yyyy-MM-dd HH:mm:ss");    // 做事    timer1.Start();
    }private void Form1_Load(object sender, EventArgs e)  //加载事件
    {
        System.Windows.Forms.Control.CheckForIllegalCrossThreadCalls = false;
        timer1.Interval = 10000;
        timer1.Start();
    }
      

  12.   

    感谢大家的热心回帖(一贯原则:参与就有分)!最后的解决办法:在用个timer2来控制timer1,通过一个变量来控制,当timer1完成一次后,改变flog的值,timer2就是通过这个blog来控制timer1,这样就解决了,我一直卡在无法自动启动timer1的tick,也许这个委托TimerCallback在作怪,不过解决才是王道!如果须知详细,请给我留言!
      

  13.   

    兄弟,十分感谢您提供的思路,这个问题也困扰了我几个月,今天终于解决了。Timer_Tick事件里面的代码没有执行完,但是Interval用完的时候,Timer_Tick是会重新启动的,搞得我里面的代码总是运行两次或者多次。现在我用两个Timer来错开执行代码的时间,终于成功了!