在 .NET Framework 中,ThreadAbortException
在catch
和finally
块中以特殊方式处理:
- 如果捕获到
ThreadAbortException
,它将在catch
块的末尾自动重新引发(除非被Thread.ResetAbort
抑制)
- 在
finally
块中,ThreadAbortException
直到整个块结束都不会被“激活”。这是预期的行为。这就是为什么您有时会在try {}
部分中所有空白的finally
块中找到obscure codes的原因。它保证了本节不会被中止。
另一方面, .NET Core 不支持Thread.Abort
(引发PlatformNotSupportedException
)。 ThreadAbortException
本身尚未删除(出于兼容性方面的考虑),因此您仍然可以明确地抛出它,但我认为仍然不能如上所述进行处理(我没有对其进行测试)。
,
最后不会被以下情况打断
在 .NET 4.0.0-4.7.2 下运行此代码将无限期地在Thread.Abort()
打印foo
并最终挂起时锁定:
class Program
{
static void Main(string[] args)
{
var i = false;
var t = new Thread(() =>
{
try { Console.Write("foo"); } finally { while (true) { i=true; } }
});
t.Start();
Thread.Sleep(200);
t.Abort();
t.Join();
Console.WriteLine("bar = {0}",i);
Console.ReadKey();
}
}
尽管如此,我们不能保证有时在其他版本中不会执行该操作。
最后将被执行,但如果被
则中断
在 .NET 2.0-3.5 下运行同一部分将显示foobar = True
,这表明它已被中断。
但是,如果您这样修改它:
var t = new Thread(() =>
{
try { Console.Write("foo"); } finally { while (true) { Console.Write(".");} }
});
它将像第一个示例一样无限运行。这很奇怪。
摘要
最好直接向Microsoft询问。
,
根据我的测试,调用Thread.Abort
不会中断线程中当前正在运行的finally块。
测试代码:
var thread = new Thread(() =>
{
try
{
}
catch (ThreadAbortException)
{
Console.WriteLine("ThreadAbortException");
throw;
}
finally
{
Console.WriteLine("Thread Finally Started");
Thread.Sleep(200);
Console.WriteLine("Thread Finally Finished");
}
})
{ IsBackground = true };
thread.Start();
Thread.Sleep(100);
Console.WriteLine("Aborting...");
thread.Abort();
thread.Join();
输出(.NET Framework 4.8):
线程终于开始了
正在中止...
线程最终完成
请记住,.NET Core不支持Thread.Abort
。
System.PlatformNotSupportedException:该平台不支持线程中止。
本文链接:https://www.f2er.com/3133147.html