黑马程序员技术交流社区

标题: 关闭线程时程序卡死了 [打印本页]

作者: cancle    时间: 2014-3-18 17:00
标题: 关闭线程时程序卡死了
本帖最后由 cancle 于 2014-3-19 20:33 编辑

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

作者: mdb    时间: 2014-3-18 17:10
Abort是会引发异常的,是强制关闭线程的方法,建议在线程里设置一个标志位,通过标志来确定线程是否结束。

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

额,怎么调用Jion?能不能给详细说下,谢谢
作者: mdb    时间: 2014-3-18 17:38
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线程里判断一个值,如果符合就让线程正常结束退出。
作者: 百川    时间: 2014-3-18 20:16
顶一个,学习了

作者: cancle    时间: 2014-3-18 22:03
mdb 发表于 2014-3-18 17:38
举个例子

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

谢谢,已经噢啦~~
作者: czwanglei    时间: 2014-3-19 10:41
请把问题设置为问题结束,这样可以给你加分。。




欢迎光临 黑马程序员技术交流社区 (http://bbs.itheima.com/) 黑马程序员IT技术论坛 X3.2