Loading

c# Thread——1.为什么Abort中断线程是不可靠的

Thread.Abort 方法在c#中用作强制中断线程的执行,大多用于线程内部满足某个特定条件而自己调用关闭自身,比如下面的代码在i自增到3的时候就会停止打印。

class Program
    {
        static void Main(string[] args)
        {
            Thread thread = new Thread(ShowMessage);
            thread.Start();
            Console.Read();
        }
        public static void ShowMessage()
        {
            int i = 0;
            while (true)
            {
                if (i == 3)
                    Thread.CurrentThread.Abort();
                Console.WriteLine("hello");
                Thread.Sleep(1000);
                i++;
            }
        }
    }

结果如下:

 

 看样子是起作用了,但是原理我们可以看看Abort方法的介绍

 

 看到这里我相信很多小伙伴们都知道了,其实Abort方法就是给目标线程强制注入了一个异常,导致该线程抛出一个ThreadAbortException的的异常,而中断该线程

那么相应的为什么说Abort不安全,其实也能够讲得通了,我们可以在子线程中捕获异常,并且调用恢复线程的方法,则Abort失效。

代码如下所示:

 class Program
    {
        static void Main(string[] args)
        {
            Thread thread = new Thread(ShowMessage);
            thread.Start();
            Console.Read();
        }
        public static void ShowMessage()
        {
            int i = 0;
            while (true)
            {
                try
                {
                    if (i == 3)
                        Thread.CurrentThread.Abort();
                }
                catch (ThreadAbortException ex)
                {
                    Console.WriteLine("休想停掉我!!!");
                    Thread.ResetAbort();//恢复线程
                }
                Console.WriteLine("hello");
                Thread.Sleep(1000);
                i++;
            }
        }
    }

看看效果:

 

 此时的Abort就没有任何作用了。

posted @ 2019-11-22 02:02  BruceNeter  阅读(1140)  评论(0编辑  收藏  举报