Допустим, при запуске приложения используется следующая схема:
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?