如何中止线程并让代码仍在该线程中执行?

时间:2009-07-29 13:26:57

标签: c# multithreading

以下示例中的一本书,解释说您不会看到“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
        }

    }
}

3 个答案:

答案 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已结束”。从未打印过。