A股上市公司传智教育(股票代码 003032)旗下技术交流社区北京昌平校区

 找回密码
 加入黑马

QQ登录

只需一步,快速开始

© cancle 中级黑马   /  2014-3-18 17:00  /  1400 人查看  /  6 人回复  /   0 人收藏 转载请遵从CC协议 禁止商业使用本文

本帖最后由 cancle 于 2014-3-19 20:33 编辑

什么情况下关闭线程时程序会卡死啊?
我的程序在这一步卡死了
private void Server_FormClosing(object sender, FormClosingEventArgs e)
        {
            if(th1!=null)
            {
                th1.Abort();//每当程序走到这一步就卡死了,什么情况啊
            }
       }

评分

参与人数 1技术分 +1 收起 理由
czwanglei + 1

查看全部评分

6 个回复

倒序浏览
Abort是会引发异常的,是强制关闭线程的方法,建议在线程里设置一个标志位,通过标志来确定线程是否结束。

在调用 Abort 方法以销毁线程时,公共语言运行库将引发 ThreadAbortException。ThreadAbortException 是一种可捕获的特殊异常,但在 catch 块的结尾处它将自动被再次引发。引发此异常时,运行库将在取消线程前执行所有 finally 块。由于线程可以在 finally 块中进行未绑定的计算,因此必须调用 Join 方法以保证线程已死亡。Join 是一个阻塞调用,它要到线程实际停止执行后才返回。
回复 使用道具 举报
mdb 发表于 2014-3-18 17:10
Abort是会引发异常的,是强制关闭线程的方法,建议在线程里设置一个标志位,通过标志来确定线程是否结束。
...

额,怎么调用Jion?能不能给详细说下,谢谢
回复 使用道具 举报
cancle 发表于 2014-3-18 17:15
额,怎么调用Jion?能不能给详细说下,谢谢

举个例子
  1.         private void Form1_Load(object sender, EventArgs e)
  2.         {
  3.             //线程1
  4.             Thread ThreadA = new Thread(th1);
  5.             //启动线程
  6.             ThreadA.Start();
  7.             // 等待线程结束
  8.             ThreadA.Join();
  9.             // 开始主线程任务
  10.             for (int i = 0; i < 1000000; i++)
  11.             {
  12.                 if (i % 10000 == 0)
  13.                     Console.Write("2");
  14.             }
  15.         }
  16.         private void th1()
  17.         {
  18.             for (int i = 0; i < 1000000; i++)
  19.             {
  20.                 if (i % 10000 == 0)
  21.                     Console.Write("1");
  22.             }
  23.         }
复制代码

如果把ThreadA.Join();这句代码注释的话你会发现输出是没有顺序的类似111221212122这样的,如果加上ThreadA.Join();后就会等待A线程结束后才会输出11111,所以你可以在A线程里判断一个值,如果符合就让线程正常结束退出。

评分

参与人数 1技术分 +1 收起 理由
czwanglei + 1

查看全部评分

回复 使用道具 举报
顶一个,学习了
回复 使用道具 举报
mdb 发表于 2014-3-18 17:38
举个例子

如果把ThreadA.Join();这句代码注释的话你会发现输出是没有顺序的类似111221212122这样的,如 ...

谢谢,已经噢啦~~
回复 使用道具 举报
请把问题设置为问题结束,这样可以给你加分。。
回复 使用道具 举报
您需要登录后才可以回帖 登录 | 加入黑马