Есть ли простой способ доступа к настраиваемым данным конфигурации на основе System.Configuration через поточно-безопасный интерфейс, не требуя, чтобы каждый контекст выполнения загружал/перезагружал конфигурационную информацию, которая была бы чрезмерно обременительной?Реальное безопасное использование System.Configuration
System.Configuration классы, как и большинство (все?) Другие классы в документации от Microsoft .Net библиотеки, помечаются следующей информацией поточно-безопасности:
Любое публичное статическую (Shared в Visual Basic) члены этого типа являются потокобезопасными. Любые члены экземпляра не гарантируют безопасность потоков.
По моему чтению этого, ConfigurationSection
объектов возвращаются из ConfigurationManager.GetSection(string)
и других аналогичных методов (например, OpenExeConfiguration(string exePath).GetSection(string)
) не должен считаться поточно-и, следовательно, не должен использоваться в нескольких контекстах выполнения. Это запрещает хранение ConfigurationSection
в одноэлементном режиме, который в противном случае был бы потокобезопасным, поскольку, поскольку доступ к объекту раздела может быть безопасным, члены самого объекта небезопасны.
Однако несколько вызовов для GetSection
, скорее всего, потребуют повторного анализа файлов конфигурации и выделения новых экземпляров ConfigurationSection
, которые имеют высокие накладные расходы, учитывая, что конфигурация вряд ли когда-либо изменится после инициализации. Кроме того, копирование данных конфигурации в другой объект, который был сделан поточно-безопасным, по-видимому, лишает одно из основных преимуществ использования встроенного пакета конфигурации в первую очередь (легкий доступ к информации, преобразованной по типу и проверенной конфигурации, без особого шаблона код).
Итак, есть ли способ использовать System.Configuration
в потокобезопасном режиме, не прибегая к избыточному анализу и распределению разделов конфигурации? Внедряет ли ваша собственная ConfigurationSection
вам недостаток гарантии, предоставляемой Microsoft, даже несмотря на то, что вы обращаетесь к ней через интерфейсы System.Configuration
(и если да, как бы вы реализовали ее как поточнобезопасную при доступе к базовому индексу ConfigurationSection
? требуется для доступа к настроенным данным)?
Из-за этого у меня был случайный сбой IIS-сервера в течение последних 5 месяцев. Не знаю, почему (авария была переполнением стека в MSCorLib), пока это не произошло на моей машине dev, и вызвал ее вызов appsettings. Я думаю, это отвечает на мой вопрос. Благодарю. –