gpt4 book ai didi

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

转载 作者:行者123 更新时间:2023-11-30 17:28:43 26 4
gpt4 key购买 nike

假设应用程序启动依赖于以下模式:

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 是否可能同时在多个静态 ctors 中运行代码?

或者 CLR 是否始终保证工作负载 1 在工作负载 2 开始之前完成,等等。

显然这可以保证:

public class DbObjects
{
static DbObjects()
{
var config = new ConfigSettings();
var c = new Connection(config.DbConnectionString);
// etc.
}
}

但是 ctors 代码不交互的情况呢?

启动多个长时间运行的异步进程的启动代码路径又如何,每个异步进程首次引用一个或多个静态类?所以第一次引用的顺序是不确定的。在这种情况下,CLR 会将静态 ctors 排队吗?

最佳答案

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

关于c# - .NET 在启动时执行多个静态构造函数,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/52230522/

26 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com