今天看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 捕获一下这个异常,以防程序出错。