try-catch-finally 引发的奇怪问题

今天,发现我们的一个Windows Service无法正常停止,无奈之下只能杀了进程。

为了找到原因,我在本地进行调试,发现程序里用到了多线程,而代码正是卡在了workThread.Abort()语句而无法停止。

为什么不能Abort? 继续看线程调用的方法的代码,发现没有什么特殊的代码,只是在其中用了Thread.Sleep进行长时间等待。

难道是这个引起的? 写了一个测试程序验证,

?
class  Program
     {
         private  readonly  Thread workThread;
 
         public  Program()
         {
             workThread = new  Thread(DoWork);
         }
 
         static  void  Main( string [] args)
         {
             new  Program().Work();
             Console.ReadLine();
         }
 
         private  void  Work()
         {
             workThread.Start();
             Thread.Sleep(1 * 1000);
 
             Console.WriteLine( "aborting" );
             workThread.Abort();
             Console.WriteLine( "aborted" );
         }
 
         private  void  DoWork()
         {
                 Console.WriteLine( "started" );
                Thread.Sleep(300 * 1000);
         }
     }

发现可以正常终止。

started
aborting
aborted

 

再仔细检查,发现其中一处Thread.Sleep放在了finally块中,修改测试代码

复制代码
class Program
    {
        private readonly Thread workThread;

        public Program()
        {
            workThread = new Thread(DoWork);
        }

        static void Main(string[] args)
        {
            new Program().Work();
            Console.ReadLine();
        }

        private void Work()
        {
            workThread.Start();
            Thread.Sleep(1 * 1000);
            Console.WriteLine("aborting");
            workThread.Abort();

            Console.WriteLine("aborted");
        }

        private void DoWork()
        {
            try
            {
                Console.WriteLine("started");
            }
            catch (Exception)
            {
                throw;
            }
            finally
            {
                for (int i = 0; i < 3; i++)
                {
                    Console.WriteLine("ThreadState:" + workThread.ThreadState);
                    Thread.Sleep(1000);
                }
            }
        }
    }
复制代码

输出:

started

你可能感兴趣的:(finally)