比方说,应用启动取决于以下模式:
public partial class App : Application
{
void App_Startup(object sender, StartupEventArgs e)
{
var config = new ConfigSettings();
var dbObjects = new DbObjects();
// many other such static classes
public class ConfigSettings
{
static ConfigSettings()
{
// long-running workload 1
// read huge xml file parse and populate cache
}
}
public class DbObjects
{
static DbObjects()
{
// long-running workload 2 :
// query db for thousands of objects populate to cache
}
}
显然,这种模式由于许多原因(例如效率,故障排除,用户体验等)而存在问题。
但是我的问题是,为了提高效率,CLR是否可能同时在多个静态ctor中运行代码?
还是CLR总是保证工作负载1在工作负载2开始之前完成,等等。
显然,可以保证:
public class DbObjects
{
static DbObjects()
{
var config = new ConfigSettings();
var c = new Connection(config.DbConnectionString);
// etc.
}
}
但是在ctor的代码不交互的情况下呢?
那启动多个长时间运行的异步进程的启动代码路径又如何呢?每个异步进程都首次引用一个或多个静态类?因此,它不是第一次引用的顺序。在这种情况下,CLR是否会将静态ctor排队?
答案 0 :(得分:1)
.NET不会自发产生代码的新线程。首先访问该类的线程是在那个时候运行静态构造函数的线程。如果两个线程同时访问它,则一个将获胜,另一个将等待直到第一个线程完成。