You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

静态构造函数是否作为受限执行区域(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

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.05.14 08:20:19