Thread.Abort()和最后的延迟

时间:2014-10-22 22:14:45

标签: c# multithreading abort finally

当调用Thread.Abort()并且该线程正在执行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”。为什么添加方法会影响线程流产点?

1 个答案:

答案 0 :(得分:0)

在这种情况下,使用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();
        }
    }
}

对不起,迟到的回答