gpt4 book ai didi

c# - ThreadAbortException 最后能跳过吗?

转载 作者:太空狗 更新时间:2023-10-29 22:14:01 25 4
gpt4 key购买 nike

我读过的所有内容都声称线程中止将在从 ThreadAbortException 结束之前执行 finally block 。我想确认这一点,这样我就可以计划如何处理一些可以无限期挂起的第三方代码。但是以下测试让我感到困惑:

public void runTest(DateTime deadline)
{
testThread = new Thread(() =>
{
try
{
Console.WriteLine("test thread started at " + DateTime.Now.ToShortTimeString());
while (true) { }
}
finally
{
Console.WriteLine("test thread entered FINALLY at " + DateTime.Now.ToShortTimeString());
while (true) { }
}
});
testThread.Start();
while (testThread.IsAlive && deadline.Subtract(DateTime.Now).TotalSeconds > 0)
{
Console.WriteLine("main thread while loop " + DateTime.Now.ToShortTimeString());
Thread.Sleep(10000);
}
if (testThread.IsAlive)
testThread.Abort();
Console.WriteLine("main thread after abort call " + DateTime.Now.ToShortTimeString());
}

运行时我发现控制台从未提及进入 finally block 。应用程序在 .abort 调用之后继续运行,就好像根本没有 finally block 一样。难道我做错了什么?在到达控制台的最终写入之前,不应该将控制权传递给 finally block ,或者执行顺序是否仍然取决于 finally 在单独的线程中或其他什么?

最佳答案

Docs say : ThreadAbortException 是一个可以捕获的特殊异常,但它会在 catch block 的末尾自动再次引发。引发此异常时,运行时会在结束线程之前执行所有 finally block 。因为线程可以在 finally block 中进行无限计算或调用 Thread.ResetAbort 来取消中止,所以不能保证线程永远结束。

我很确定您的线程正在被转储,因为您退出该方法并丢失了对它的引用,因此它被垃圾收集器收集。尝试使 testThread 变量成为该类的字段成员,看看会发生什么。

那,或者你有一个竞争条件,因为线程是并行运行的:主线程在启动的测试线程可以输出最终数据之前完成(异常是昂贵的并且需要时间来到达 catch 或 finally 阻塞)。

关于c# - ThreadAbortException 最后能跳过吗?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/18002668/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com