【发布时间】:2011-12-21 08:35:30
【问题描述】:
我有多个线程使用同一个静态类和长时间运行的静态构造函数。
我可以确定,只有在完成由其中一个线程引起的对静态类的构造函数的调用后,才能从所有线程同时使用此类?
【问题讨论】:
我有多个线程使用同一个静态类和长时间运行的静态构造函数。
我可以确定,只有在完成由其中一个线程引起的对静态类的构造函数的调用后,才能从所有线程同时使用此类?
【问题讨论】:
是的,当然。 C# 规范第 10.12 节保证了这一点。我试图找到一个更明确的关于线程的部分,因为该部分只保证它会被执行一次。
请注意,如果你有一种“递归初始化”设置,你仍然可以在一个类完全初始化之前在一个类中执行代码——如果两个静态构造函数相互依赖,那么你最终会得到如果每个类在不同的线程中初始化,则会出现死锁。
还请注意,空静态构造函数的存在会影响静态字段初始化程序的时间 - 如果您没有静态构造函数,则 CLR 可以在何时初始化字段时有更多的余地。 (实际行为随着时间的推移而改变,但始终在规范范围内。)有关静态字段初始化器的更多信息,请参阅规范的第 10.5.5.1 节。
基本上,尽量保持静态构造函数简单且自包含。
【讨论】: