.NET在启动时执行多个静态构造函数

时间:2018-09-07 22:58:31

标签: c# multithreading static startup synchronous

比方说,应用启动取决于以下模式:

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排队?

1 个答案:

答案 0 :(得分:1)

.NET不会自发产生代码的新线程。首先访问该类的线程是在那个时候运行静态构造函数的线程。如果两个线程同时访问它,则一个将获胜,另一个将等待直到第一个线程完成。