A线程执行过程需要10秒钟;
主线程里每隔3秒钟时间调用一次A线程,如果A线程已经在执行,就结束掉重新执行类似于js里面的setTimeout和clearTimeout不知道怎么实现。

解决方案 »

  1.   

    在主界面用Timer控件,每3秒检查一次不行么?
    结束线程有二种方式:一种是直接调用线程的Abort()函数;再一种给子线程设共用指示变量,子线程循环检查指示变量的值,主线程控制指示变量的值。
    这二种方式是我用过的,不知道有没有别的方式。
      

  2.   

    首先感谢回复。
    因为在学习thread,所以不会用其他方法来做;
    我使用Abort方法,尽管Thread.IsAlive==false了,但是那个线程执行的方法却仍然在继续执行Thread showcoolThread = new Thread(new ThreadStart(() => {
                    try
                    {
                        lblCool.Visible = true;
                        string sss = lblMark.Text;//lblMark是用于记录一个状态值的
                        SetTimeout(4000, () => { lblCool.Text = sss; });
                    }
                    catch { MessageBox.Show("ex"); }
                }));Action showCool = () =>
                {
                    
                    try
                    {
                        if (showcoolThread.IsAlive)
                        {
                            showcoolThread.Abort();
                        }
                        //MessageBox.Show(showcoolThread.IsAlive ? "alive" : "dead");
                        //确实dead了,但是之前的延时操作并没有终止
                        showcoolThread = new Thread(new ThreadStart(() =>
                        {
                            try
                            {
                                lblCool.Visible = true;
                                string sss = lblMark.Text;
                                SetTimeout(4000, () => { lblCool.Text = sss; });
                            }
                            catch { MessageBox.Show("ex"); }
                        }));
                        showcoolThread.Start();
                    }
                    catch(Exception ex) { MessageBox.Show(ex.Message); }
                };
      

  3.   

    我把疑惑的地方剥出来,好看些
    public void changelbl()
            {
                SetTimeout(4000, () => { label1.Text = ""; });
            }Thread showcoolThread;
    private void button1_Click(object sender, EventArgs e)
            {
                showcoolThread = new Thread(new ThreadStart(changelbl));
                showcoolThread.Start();
            }        private void button2_Click(object sender, EventArgs e)
            {
                showcoolThread.Abort();
                showcoolThread.Join();
            }//延时操作
    public static void SetTimeout(double interval, Action action)
            {
                System.Timers.Timer timer = new System.Timers.Timer(interval);
                timer.Elapsed += delegate(object sender, System.Timers.ElapsedEventArgs e)
                {
                    timer.Enabled = false;
                    action();
                };
                timer.Enabled = true;
            }点击按钮1,执行4秒后更新label,4秒内点击按钮2强行终止线程没有效果,一会儿label还是更新了
      

  4.   

    这个问题和线程没有关系...你虽然终止了线程但那个Timer既没有disabled也没有dispose,它还在运行...
      

  5.   

    System.Timers.Timer是非托管资源,必须主动销毁...你这代码已经有内存泄漏了...
      

  6.   

    嗯,那天晚上我就找的这个原因。就是这个SetTimeOut方法用的Timer导致的
      

  7.   

    LZ以前是学C++的?
    我以前学的是VB,看你的代码看得满头包……
      

  8.   

    2个错误.
    第一个:SetTimeout(4000, () => { label1.Text = ""; });
    线程间访问控件用代理才行.
    第二个,System.Timers.Timer 是基于另外的线程,和你自己定义的线程运行没有任何关系.
    你在新开线程里做的操作,只是把一个代理加到Timer的事件里面,所以自己定义线程关闭并不会影响那个action的执行.
    正确的写法:        delegate void Change();
            public void changelbl()
            {
                while (true)
                {
                    Thread.Sleep(4000);
                    {
                        Change change = delegate()
                        {
                            label1.Text = "";
                        };
                        this.Invoke(change);
                        //Console.WriteLine("ge");
                    }
                    break;
                }
                //SetTimeout(4000, () => { Console.WriteLine("Gf"); });
            }
            private void button2_Click_1(object sender, EventArgs e)
            {
                showcoolThread.Abort();
                //showcoolThread.Join();        }
      

  9.   

    当然对于你这种需要重复执行的方法,不推荐多次打开和关闭线程来控制,因为开关线程是很消耗系统资源的.
    你可以在关闭的方法里面,比button2_Click_1设置一个变量,更改这个变量的值,当线程里面时间到了以后马上要执行
    Change change = delegate()
                        {
                            label1.Text = "";
                        };
                        this.Invoke(change);
    之前 判断下这个变量的值.