Вопрос

родовое слово

Вот последовательность, которую я предполагал

  1. Запуск статического конструктора
  2. Конец статического конструктора
  3. Начало главного
  4. Начало MyMethod
  5. Конец основного

Теперь при любом сценарии, если 4 начнутся раньше 2, я облажался.Возможно ли это?

Это было полезно?

Решение

Вы задали здесь только один вопрос, но есть около дюжины вопросов, которые вы должны задать, поэтому я отвечу на них все.

<цитата>

Вот последовательность, которую я предполагал

  1. Начало конструктора класса (также известного как cctor)
  2. Конец cctor
  3. начало основного
  4. начало MyMethod
<цитата>

Это правильно?

Нет. Правильная последовательность:

  1. Запуск cctor программы, если она есть. Нет.
  2. Конец программы, если таковая имеется. Нет.
  3. Начало основного
  4. Запуск cctor для MyClass
  5. Конец cctor для MyClass
  6. Начало MyClass.MyMethod
<цитата>

Что делать, если есть инициализатор статического поля?

В некоторых случаях CLR может изменять порядок запуска инициализаторов статических полей. Подробности см. На странице Джона по этой теме:

Различия между статическими конструкторами и инициализаторами типов

<цитата>

Возможно ли, чтобы статический метод, такой как MyMethod, был вызван до завершения работы cctor этого класса?

Да. Если сам cctor вызывает MyMethod, то очевидно, что MyMethod будет вызываться до завершения cctor.

<цитата>

Сектор не вызывает MyMethod. Возможно ли когда-либо вызвать статический метод, такой как MyMethod, до завершения cctor MyClass?

Да. Если cctor использует другой тип, cctor которого вызывает MyMethod, то MyMethod будет вызываться до завершения работы MyClass cctor.

<цитата>

Никто из участников прямо или косвенно не вызывает MyMethod! Возможно ли, чтобы статический метод, такой как MyMethod, был вызван до завершения работы cctor MyClass?

Нет.

<цитата>

Верно ли это, даже если задействовано несколько потоков?

Да. Сектор завершит работу в одном потоке, прежде чем статический метод можно будет вызвать в любом потоке.

<цитата>

Можно ли вызывать секцию более одного раза? Предположим, что оба потока вызывают запуск cctor.

Гарантируется, что cctor будет вызываться не более одного раза, независимо от того, сколько потоков задействовано. Если два потока вызывают MyMethod «одновременно», они участвуют в гонке. Один из них проигрывает гонку и блокируется до тех пор, пока MyClass cctor не завершит работу в выигрышном потоке.

<цитата>

Проигрывающий поток блокируется до тех пор, пока не завершится проверка? Правда ?

Действительно.

<цитата>

Так что, если cctor в выигрышном потоке вызывает код, который блокирует блокировку, ранее принятую проигравшим потоком?

Тогда у вас есть классическое условие инверсии порядка блокировок. Ваша программа заходит в тупик. Навсегда.

<цитата>

Это кажется опасным. Как избежать тупика?

Если это причиняет вам боль, прекратите это делать . Никогда не делайте того, что может заблокировать в cctor.

<цитата>

Это хорошая идея - полагаться на семантику инициализации cctor для обеспечения выполнения сложных требований безопасности? И стоит ли иметь cctor, который взаимодействует с пользователем?

Тоже плохие идеи. Я советую вам найти другой способ гарантировать выполнение предварительных условий ваших методов, влияющих на безопасность.

Другие советы

Согласно MSDN , статический конструктор:

<цитата>

Статический конструктор вызывается автоматически для инициализации класса до создания первого экземпляра или любых статических членов ссылка.

Таким образом, статический конструктор будет вызываться перед вызовом статического метода MyClass.MyMethod() (конечно, при условии, что не также вызывается во время статического построения или инициализации статического поля).

Итак, если вы делаете что-то асинхронное в этом генеральном кодовом коде, то ваша задача - синхронизировать это.

№3 на самом деле №1: статическая инициализация не начинается до первого использования класса, к которому она принадлежит.

Это возможно, если MyMethod вызывается из статического конструктора или статического блока инициализации.Если вы не вызываете MyMethod прямо или косвенно из статического конструктора, все будет в порядке.

Из документации (выделено мной): <цитата>

Статический конструктор вызывается автоматически для инициализации класса перед созданием первого экземпляра или любые статические члены упоминается .

Вы можете гарантировать, что 4 всегда будет стоять после 2 (если вы не создадите экземпляр своего класса из своего статического метода), однако это неверно для 1 и 3.

Статический конструктор будет вызван перед выполнением mymethod.Однако, если вы облажались, если 4 вызывается перед 2, я предлагаю вам переосмыслить свой дизайн.В любом случае не следует делать сложные вещи в статическом конструкторе.

CLR гарантирует, что статический конструктор запускается до обращения к статическим членам.Однако ваш дизайн немного пахнет.Проще было бы сделать что-то вроде этого:

родовое слово

В вашем дизайне, если аутентификация не удалась, единственный способ предотвратить запуск MyMethod - это создать исключение.

Гарантируется, что конструктор статического класса был вызван до выполнения любого из его методов.Пример:

родовое слово

Вывод:

<цитата>

Нажмите "Ввод"

// после нажатия Enter

Привет, входящий ...

Привет!

Привет!

Вот фактический порядок, в котором все идет вниз:

  1. Начало генерального кодового кода
  2. Начало конструктора статического кода кода.
  3. Конец статического конструктора Main
  4. Начало генерального кодового кода
  5. Конец общего кодового тега

Или вы можете пройти через отладчик.

Лицензировано под: CC-BY-SA с атрибуция
Не связан с StackOverflow
scroll top