以下示例中的一本书,解释说您不会看到“DoWork已结束”这一行:
...因为线程被中止了 而DoWork正在执行 Thread.sleep代码
这是有道理的,但奇数的是,如果你将第一个睡眠时间改为6000以使DoWork线程有时间完成5000睡眠,那么DoWork线程将会打印“DoWork已结束”,但这是在DoWork线程中止后,所以如果此时DoWork线程已中止,那么打印的线是什么线程“DoWork已经结束”正在运行?(它似乎在中止线程中的那个点上运行)
using System;
using System.Threading;
namespace TestThreading838
{
class Program
{
static void Main(string[] args)
{
Console.WriteLine("MAIN THREAD started.");
Thread DoWorkThread = new Thread(new ThreadStart(DoWork));
DoWorkThread.Start();
Thread.Sleep(1000); //if you change this to 6000 you see "DoWork has ended."
DoWorkThread.Abort();
Console.WriteLine("MAIN THREAD ending...");
Thread.Sleep(6000);
Console.WriteLine("MAIN THREAD ended.");
Console.ReadLine();
}
public static void DoWork()
{
Console.WriteLine("DoWork is running.");
try
{
Thread.Sleep(5000);
}
catch (ThreadAbortException ex)
{
Console.WriteLine("DoWork was aborted.");
}
finally
{
Console.WriteLine("DoWork cleaning up after being aborted.");
}
Console.WriteLine("DoWork has ended."); //never shown
}
}
}
答案 0 :(得分:3)
如果你将第一次睡眠改为6000,那么辅助线程会在你中止它之前完成它需要做的所有事情 - 它并没有真正中止,因为你刚刚在一个已经死了的线程上调用了Abort
。请注意,“DoWork已中止”将不会打印...
在致电DoWorkThread.ThreadState
之前尝试打印Abort
- 我很确定您会看到它已“停止”。
答案 1 :(得分:1)
“DoWork已结束”正在第二个线程(DoWorkThread)上运行。
DoWorkThread.Start(); //Run the thread
Thread.Sleep(6000); //Let the thread run for 6sec so "DoWork has ended" will be displayed
DoWorkThread.Abort();
答案 2 :(得分:0)
除非您调用Thread.ResetAbort(),否则将自动重新抛出ThreadAbortException。因此,在捕获之后,系统重新抛出它并最终执行,但此时它变为未处理的异常,因此“DoWork已结束”。从未打印过。