C# Thread.Abort方法與ThreadAbortException異常(取消線程與異常處理)


1、Abort當前線程,后續程序不會執行

class Program
{
    public static Thread thread1;

    static void Main(string[] args)
    {
        thread1 = new Thread(Method1);
        thread1.Start();
        Console.ReadKey();
    }
    public static void Method1()
    {
        try
        {
            for (int i = 0; i < 10; i++)
            {
                Console.WriteLine("Mthod1: " + i.ToString());
                Thread.Sleep(1000);
                if (i == 3)
                {
                    Thread.CurrentThread.Abort();   // 拋出的ThreadAbortException異常
                }
                Console.WriteLine("Mthod1: " + i.ToString() + " End");
            }
        }
        catch (SocketException ex)
        {
            Console.WriteLine("Method1 SocketException: " + ex.ToString());
        }
        catch (ThreadAbortException ex)
        {
            // ThreadAbortException要在Exception的前面,因為Exception能夠匹配所有異常
            Console.WriteLine("Method1 ThreadAbortException: " + ex.ToString());
        }
        catch (Exception ex)
        {
            Console.WriteLine("Method1 Exception: " + ex.ToString());
        }
        finally
        {
            Console.WriteLine("Method1 Finally:");
        }
    }

}

執行結果:

1、thread1.Abort()執行后會直接拋出ThreadAbortException異常。

2、異常會停止后續所有程序的執行(沒有輸出"Method1: 3 End")。

3、catch語句會執行。catch (Exception ex)和catch (ThreadAbortException ex)都可以捕獲異常,由於Exception可以匹配所有異常,因此catch (ThreadAbortException ex)應該在catch (Exception ex)的前面使用,所以輸出了“"Method1 ThreadAbortException”。

4、finally語句會執行

2、Abort當前線程,進行try catch捕獲異常

class Program
{
    public static Thread thread1;

    static void Main(string[] args)
    {
        thread1 = new Thread(Method1);
        thread1.Start();
        Console.ReadKey();
    }

    public static void StopMethod1()
    {
        try
        {
            thread1.Abort();                 // 首先捕獲拋出的ThreadAbortException異常
        }
        catch (Exception ex)
        {
            Console.WriteLine("StopMethod1: " + ex.ToString());
        }
    }
    public static void Method1()
    {
        try
        {
            for (int i = 0; i < 10; i++)
            {
                Console.WriteLine("Mthod1: " + i.ToString());
                Thread.Sleep(1000);
                if (i == 5) StopMethod1();  // 再次捕獲拋出的ThreadAbortException異常
            }
        }
        catch (Exception ex)
        {
            Console.WriteLine("Method1: " + ex.ToString()); 
        }
    }        
}

運行結果:

try catch{} 捕獲兩次拋出的ThreadAbortException。

2、Abort當前線程,不進行try catch捕獲異常

class Program
{
    public static Thread thread1;

    static void Main(string[] args)
    {
        thread1 = new Thread(Method1);
        thread1.Start();
        Console.ReadKey();
    }

    public static void StopMethod1()
    {
        thread1.Abort();
    }
    public static void Method1()
    {
        for (int i = 0; i < 10; i++)
        {
            Console.WriteLine("Mthod1: " + i.ToString());
            Thread.Sleep(1000);
            if (i == 5) StopMethod1();
        }
    }
}

運行結果:

1、雖然線程拋出了ThreadAbortException異常,由於線程中沒有使用try catch的語句捕獲異常,所以看上去線程很平靜的退出了。

2、而且,由於是在線程中拋出的異常,所以主進程沒有任何錯誤提示。

3、for循環只輸出到5,Abort()后一般線程會直接停止。

3、在一個線程中Abort另一個線程

class Program
{
    public static Thread thread1;
    public static Thread thread2;

    static void Main(string[] args)
    {
        thread1 = new Thread(Method1);
        thread2 = new Thread(Method2);
        thread1.Start();
        thread2.Start();
        Console.ReadKey();
    }

    public static void StopMethod1()
    {
        try
        {
            thread2.Abort();
        }
        catch (Exception ex)
        {
            Console.WriteLine("StopMethod1: " + ex.ToString());
        }
    }
    public static void Method1()
    {
        try
        {
            for (int i = 0; i < 10; i++)
            {
                Console.WriteLine("Method1: " + i.ToString());
                Thread.Sleep(1000);
                if (i == 5) StopMethod1();
            }
        }
        catch (Exception ex)
        {
            Console.WriteLine("Method3: " + ex.ToString());
        }
    }
    public static void Method2()
    {
        try
        {
            for (int i = 0; i < 10; i++)
            {
                Console.WriteLine("Method2: " + i.ToString());
                Thread.Sleep(1000);
            }
        }
        catch (Exception ex)
        {
            Console.WriteLine("Method2: " + ex.ToString());
        }
    }
}

運行結果:

1、可以看到只在thread2中捕獲到了ThreadAbortException異常。

2、thread1完整的運行完畢了,並且沒有ThreadAbortException異常拋出。

總結

1、theadX.Abort()方法會在線程X中拋出ThreadAbortException異常,線程X中所有正在執行的try catch都會捕獲該異常。

2、theadX.Abort()有可能在Y線程中調用的,不會在Y線程中拋出ThreadAbortException異常。


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM