.NET выполняет несколько статических конструкторов при запуске - PullRequest
0 голосов
/ 08 сентября 2018

Допустим, при запуске приложения используется следующая схема:

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?

1 Ответ

0 голосов
/ 08 сентября 2018

.NET не будет самопроизвольно создавать новые темы для вашего кода.Поток, который сначала обращается к классу, является тем, который запускает статический конструктор в этой точке.Если два потока обращаются к нему одновременно, один выигрывает, а другой будет ждать, пока первый не будет завершен.

...