书如下面的例子,并解释说,你不会看到行“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
}
}
}
不要忘记,没有什么需要中止的线程实际中止_ever_。如果你有一条敌意被拆除的线索,它可以保持自己的活力;真正采取行动的唯一方法是取消它的过程。这是线程中止是纯粹的邪恶并应该避免的另一个原因。如果你不能干净地采用线程,那么它应该在它自己的过程中。 – 2009-07-29 15:15:03