当调用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”。为什么添加方法会影响线程流产点?
答案 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();
}
}
}
对不起,迟到的回答