Вы задали здесь только один вопрос, но есть около дюжины вопросов, которые вам следовало бы задать, так что я отвечу на них все.
Вот последовательность, которую я предположил
- Начало конструктора класса (также известного как
cctor
)
- Конец сектора
- начало Main
- запуск MyMethod
Это верно?
Нет. Правильная последовательность:
- Запуск cctor программы, если он есть. Нет.
- Конец программы, если таковая имеется. Нет.
- Начало основного
- Запуск cctor для MyClass
- Конец cctor для MyClass
- Запуск MyClass.MyMethod
Что делать, если есть инициализатор статического поля?
В некоторых случаях CLR разрешено изменять порядок, в котором запускаются инициализаторы статических полей. Подробности см. На странице Джона по этой теме:
Различия между статическими конструкторами и инициализаторами типов
Возможно ли, чтобы статический метод MyMethod
был вызван до завершения работы cctor этого класса?
Да. Если сам cctor вызывает MyMethod, то очевидно, что MyMethod будет вызываться до завершения cctor.
Сектор не вызывает MyMethod. Возможно ли, чтобы статический метод MyMethod
был вызван до завершения работы cctor MyClass?
Да. Если cctor использует другой тип, cctor которого вызывает MyMethod, то MyMethod будет вызываться до завершения cctor MyClass.
Никакие специалисты не вызывают MyMethod прямо или косвенно! Возможно ли, чтобы статический метод MyMethod
был вызван до завершения работы cctor MyClass?
Нет.
Это все еще верно, даже если задействовано несколько потоков?
Да. Cctor завершит работу в одном потоке, прежде чем статический метод можно будет вызвать в любом потоке.
Можно ли звонить в cctor более одного раза? Предположим, что оба потока вызывают запуск cctor.
Гарантируется, что cctor будет вызван не более одного раза, независимо от того, сколько потоков задействовано. Если два потока вызывают MyMethod «одновременно», они участвуют в гонке. Один из них проигрывает гонку и блокируется до тех пор, пока MyClass cctor не завершит работу в выигрышном потоке.
Потерявшаяся нить блокируется до тех пор, пока не завершится работа с сектором? Правда ?
В самом деле.
Так что, если cctor в выигрышном потоке вызывает код, который блокирует блокировку, ранее взятую проигравшим потоком?
Тогда у вас есть классическое условие инверсии порядка блокировок. Ваша программа заходит в тупик. Навсегда.
Это кажется опасным. Как избежать тупика?
Если это причиняет боль, прекратите это делать . Никогда не делайте того, что может заблокировать в cctor.
Является ли хорошей идеей полагаться на семантику инициализации cctor для обеспечения выполнения сложных требований безопасности? И хорошая ли идея иметь cctor, который взаимодействует с пользователем?
Тоже не хорошие идеи. Я советую вам найти другой способ гарантировать выполнение предварительных условий ваших методов, влияющих на безопасность.