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"。为什么添加方法会影响线程点流产?
在这种情况下,用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();
}
}
}
很抱歉延迟回答