none
如何终止线程? RRS feed

  • 问题

  • 在Button1_Click()方法中,第一次点击时开了一个线程t,当再次点击时,如果t还没有运行完,就终止它,可以实现吗?应该怎么写代码?第一次点击时的启动线程方法如下:
    private void button1_Click(object sender, EventArgs e)
            {
                //这里添加代码:判断如果t在运行,则终止t
                Thread t = new Thread(m);
                t.Start();
            }
            void m()
            { }
    
    
    
    

    谢谢指教!
    2011年9月14日 0:59

答案

  • 你好!参考下面的示例

    System.Threading.Thread fThread;
    
    private void button1_Click(object sender, EventArgs e)
    {
        if (fThread == null) // 为 null 则启用新的线程
        {
            fThread = new System.Threading.Thread(new System.Threading.ThreadStart(DoSth));
            fThread.Start();
        }
        else
        {
            fThread.Abort();
            fThread = null;
        }
    }
    
    public void DoSth()
    {
        while (true)
        {
            this.BeginInvoke(new Action(delegate
            {
                this.Text = Guid.NewGuid().ToString();
            }));
    
            System.Threading.Thread.Sleep(50);
        }
    }
    


    知识改变命运,奋斗成就人生!
    • 已标记为答案 JSHZP 2011年9月14日 7:19
    2011年9月14日 2:49
    版主
  • 你好!

    你理解错了,Abort 后 fThread  并不等于 null ,你看我上面代码中设置   fThread = null; 为为了实现你的需求特殊设定的。

    知识改变命运,奋斗成就人生!
    • 已标记为答案 JSHZP 2011年9月14日 7:19
    2011年9月14日 5:30
    版主

全部回复

  • 你好!参考下面的示例

    System.Threading.Thread fThread;
    
    private void button1_Click(object sender, EventArgs e)
    {
        if (fThread == null) // 为 null 则启用新的线程
        {
            fThread = new System.Threading.Thread(new System.Threading.ThreadStart(DoSth));
            fThread.Start();
        }
        else
        {
            fThread.Abort();
            fThread = null;
        }
    }
    
    public void DoSth()
    {
        while (true)
        {
            this.BeginInvoke(new Action(delegate
            {
                this.Text = Guid.NewGuid().ToString();
            }));
    
            System.Threading.Thread.Sleep(50);
        }
    }
    


    知识改变命运,奋斗成就人生!
    • 已标记为答案 JSHZP 2011年9月14日 7:19
    2011年9月14日 2:49
    版主
  • 谢谢肖老师!

    继续追问:执行语句fThread.Abort();  fThread = null;之后,线程fThread实际会在什么时候终止呢?也就是说程序什么时候可以new并且start下一个线程?

    2011年9月14日 4:47
  • abort 的时候就终止了, fThread = null 为了下一次你点击按钮时声明并启动一个新的线程。
    知识改变命运,奋斗成就人生!
    2011年9月14日 4:54
    版主
  • 肖老这个例子 就是一个 不断终止,和开始一个线程的例子。你运行起来就知道了。

     

    实际上你可以不断的new新的线程(依赖操作系统限制),至于什么时候关闭,看你需要,或者让线程自己退出(线程执行的方法自己完成退出)。。


    family as water
    2011年9月14日 4:55
  • 我这样判断线程是否终止:
    fThread.Abort();  
    
    
    do { } while (fThread !=null); //等待终止之前的进程
    发现,有时候会死机,PC长时间停留在while语句里面。应该是线程在执行abort()之后没能终止,什么原因呢?

    • 已编辑 JSHZP 2011年9月14日 5:08 修改
    2011年9月14日 5:06
  • 你好!

    你理解错了,Abort 后 fThread  并不等于 null ,你看我上面代码中设置   fThread = null; 为为了实现你的需求特殊设定的。

    知识改变命运,奋斗成就人生!
    • 已标记为答案 JSHZP 2011年9月14日 7:19
    2011年9月14日 5:30
    版主