2009-07-29 10 views
0

书如下面的例子,并解释说,你不会看到行“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

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

回答

3

如果你改变了先睡一觉到6000,然后辅助线程完成它需要你放弃它之前做的一切 - 这不是真的中止了,因为你刚刚在一个已经死亡的线程上调用了Abort。请注意,“DoWork被中止”将不会被打印...

尝试打印出DoWorkThread.ThreadState,然后再致电Abort - 我很确定您会看到它是“已停止”。

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(); 
0

除非调用Thread.ResetAbort(),否则ThreadAbortException会自动重新排列。所以在它被捕获之后,系统重新抛出它并且终止被执行,但是在那时它变成了未处理的异常,因此“DoWork已经结束”。从不打印。

相关问题