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異常。