Thread.Artrt()并在finally之后延迟

本文关键字:finally 之后 延迟 并在 Artrt Thread | 更新日期: 2023-09-27 18:27:26

当调用Thread.Artrt()时,该线程正在执行finally块,那么线程在finally块完成之前不会中止。但是,正如我所看到的,ThreadAbortException不是在finally块结束后立即生成的,而是在一些延迟之后生成的:

private static volatile int val1 = 0;
public static void Func1()
{
    try
    {
    }
    finally
    {
        Thread.Sleep(5000);
    }
    //Func2();
    while (true)
        val1++;
}
public static void Main()
{
    var thread = new Thread(Func1);
    thread.Start();
    Thread.Sleep(1000);
    thread.Abort();
    thread.Join();
    Console.WriteLine(val1);  // val1 is non-zero!
}

在本例中,Main()末尾的val1将为非零。为什么会发生这种情况?

如果我取消注释对Func2()的调用(Func2是任何方法,可能为空),val1的输出将显示"0"。为什么添加方法会影响线程点流产?

Thread.Artrt()并在finally之后延迟

在这种情况下,用lock包围增量可能很有用。锁控制对该成员的访问。Abort方法只是通知线程"嘿,你现在可以停止了",但它不会杀死线程。因此,线程可以在Abort之后存活几分钟。访问lock时,线程会检查它是否被中止,并在需要时自行终止它。

这是您的示例代码编辑

using System;
using System.Threading;
namespace ConsoleApp1
{
    class Program
    {
        private static volatile int val1 = 0;
        static Object Locker = new Object();
        public static void Func1()
        {
            try
            {
            }
            finally
            {
                Thread.Sleep(5000);
            }
            //Func2();
            while (true)
            {
                //Lock the access to the member
                lock (Locker)
                    val1++;
            }
        }
        public static void Main()
        {
            var thread = new Thread(Func1);
            thread.Start();
            Thread.Sleep(1000);
            //Not needed. Just to make sure
            lock (Locker)
            {
                thread.Abort();
                thread.Join();
            }
            Console.WriteLine(val1);  // val1 is non-zero!
                                      // Now it is zero
            Console.ReadLine();
        }
    }
}

很抱歉延迟回答