今天看CSDN上一个很老的帖子,有个人说Thread.Abort()方法调用之后一定会抛出异常,我对这个有点疑问。

于是自己做了一个测试demo,来研究Abort抛出异常的时机。废话少说,直接上代码:

  static void Main(string[] args)
        {
            Thread th = new Thread(Worker);
            th.Start();
            Thread.Sleep(1000);
            try
            {
                Console.WriteLine(th.ThreadState+","+th.IsAlive);

                th.Abort();
                Console.WriteLine(th.ThreadState);
            }
            catch (Exception ex)
            {
                Console.WriteLine(ex.Message + ",");
            }
            th.Join();
            Console.WriteLine("子线程被正常终止,没有抛出异常");
            Console.WriteLine("主线程结束");
            Console.Read();
        }
       private static void Worker()
        {
            try
            {
                for (int i = 0; i < 100; i++)
                {
                    Console.WriteLine(i);
                    Thread.Sleep(100);
                }
            }
            catch (Exception ex)
            {
                Console.WriteLine(e.GetType().Name);
                Console.WriteLine("Abort抛出异常");
            }
            finally
            {
                Console.WriteLine("{0} Status is:{1} In Abort Thread", Thread.CurrentThread.Name, Thread.CurrentThread.ThreadState);
            }
        }

上面这段代码,我在子线程的循环体中加入了Thread.Sleep()方法,以便让主线程能够在子线程执行完毕之前执行Abort方法,这个时候,调用Abort方法,子线程中会抛出异常。

当我把Thread.sleep(100)这句话注释掉之后,会发现调用Abort方法之后,子线程中不会抛出异常。

所以我们由此可以得出结论,当子线程中的方法执行完毕之后,调用Abort不会出现异常,当子线程中的方法执行完毕之前,调用Abort方法的时候会抛出异常。

所以,我们在写多线程程序的时候,在Abort子线程时,一定要trycatch 捕获一下这个异常,以防程序出错。