2009-04-13 4 views
9

Есть ли простой способ доступа к настраиваемым данным конфигурации на основе 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? требуется для доступа к настроенным данным)?

ответ

5

Экземпляр, возвращаемый GetSection, не является потокобезопасным. Это означает, что вам нужно добавить код блокировки, чтобы использовать его в своем одиночном режиме.

Несколько вызовов не повторно анализируют файл, если только файл не был изменен. Данные кэшируются в памяти.

Ваша проблема безопасности потока легко решается с помощью блокировки (я не уверен, что вам нужно, если вы не измените конфигурацию во время выполнения), и проблема с производительностью не решена.

+0

Из-за этого у меня был случайный сбой IIS-сервера в течение последних 5 месяцев. Не знаю, почему (авария была переполнением стека в MSCorLib), пока это не произошло на моей машине dev, и вызвал ее вызов appsettings. Я думаю, это отвечает на мой вопрос. Благодарю. –

0

ConfigurationManager.GetSection (string) является публичным статическим членом, а поскольку msdn утверждает, что любые публичные статические (Shared in Visual Basic) члены этого типа являются потокобезопасными ', вы можете предположить, что это безопасно использовать.

Что касается производительности, я бы хотел предположить, что MS уже достаточно эффективно работает и просто использует свои функции как есть. Помните: преждевременная оптимизация - это корень зла.

Смежные вопросы