静态构造函数是否作为受限执行区域(CER)运行?相关技术咨询
静态构造函数是否属于受限执行区域(CER)?还有哪些代码块是CER?
好问题!先直接给你结论:静态构造函数确实是作为受限执行区域(CER)运行的,这也正是你的代码里t.Abort()会阻塞到静态构造执行完毕的原因。
结合你的代码解释
你提供的代码中,线程t启动后会触发MyCls的静态构造函数——而当主线程调用t.Abort()时,因为静态构造函数处于CER中,CLR会强制保证这段代码完整执行,不允许线程中止操作打断它。所以主线程会被阻塞,直到静态构造函数里的循环(输出0到9)全部完成,才会执行Abort和后续的Done输出,这完全符合你观察到的结果:
private static void Main() { var t = new Thread(() => { var m = new MyCls(); m.DoWork(); }); t.Start(); // 模拟耗时任务 Thread.Sleep(1000); t.Abort(); Console.Write("\nDone"); } public class MyCls { static MyCls() { for (int i = 0; i < 10; i++) { Console.Write(i); Thread.Sleep(1000); } } public void DoWork() { Console.WriteLine("executing DoWork.."); } }
输出:0123456789 Done
哪些代码块会作为CER运行?
除了静态构造函数,以下这些代码区域也会被CLR视为受限执行区域:
finally块:try/finally结构中的finally块是典型的CER,CLR会确保它完整执行,哪怕线程被Abort或者try块中发生未处理异常。catch块:异常处理的catch块同样属于受保护区域,线程中止操作会被延迟到catch块执行完成后才生效。- 显式声明的CER:可以通过
RuntimeHelpers.PrepareConstrainedRegions()方法手动标记一段代码为CER,这段代码以及后续关联的catch/finally块都会被当作CER处理,常用于需要保证原子性的资源操作场景。 - 终结器(Finalizer):对象的终结器(通过
~MyCls()定义)在执行时处于CER中,CLR会保证终结器逻辑完整执行,避免资源泄漏。 - .NET框架内部关键代码:比如线程池调度逻辑、同步原语(如
Monitor、Mutex)的核心操作,这些底层代码被CLR标记为CER,以保证系统级操作的一致性。
CER的核心设计目标是确保某些关键代码必须完整执行,防止程序因线程中止、异常等情况进入不一致的状态,比如静态类未初始化完成、资源未正确释放等。
内容的提问来源于stack exchange,提问作者KeyBored
相关产品推荐
相关产品推荐

