Потокобезопасное использование System.Configuration - PullRequest
9 голосов
/ 14 апреля 2009

Существует ли простой способ доступа к пользовательским данным конфигурации на основе System.Configuration через поточно-ориентированный интерфейс, не требующий от каждого контекста выполнения загрузки / перезагрузки информации о конфигурации, которая была бы обременительной в вычислительном отношении?

Классы System.Configuration, как и большинство (все?) Других классов в документации библиотеки Microsoft .Net, снабжены следующей информацией о безопасности потоков:

Любые открытые статические (Shared в Visual Basic) члены этого типа являются поточно-ориентированными. Ни один из членов экземпляра не гарантированно является потокобезопасным.

Насколько я понимаю, объекты ConfigurationSection, возвращаемые из ConfigurationManager.GetSection(string) и других подобных методов (например, OpenExeConfiguration(string exePath).GetSection(string)), не должны считаться поточно-ориентированными и, следовательно, не должны использоваться в нескольких контекстах выполнения. Это запрещает хранить ConfigurationSection в одиночном объекте, который в противном случае был бы потокобезопасным, поскольку, хотя доступ к объекту section может быть безопасным, члены самого объекта не являются безопасными.

Однако для нескольких вызовов GetSection, вероятно, потребуется повторный анализ файлов конфигурации и выделение новых экземпляров ConfigurationSection, которые требуют больших затрат, учитывая, что конфигурация вряд ли когда-либо изменится после инициализации. Кроме того, копирование данных конфигурации в другой объект, который стал поточнобезопасным, похоже, сводит на нет одно из главных преимуществ использования встроенного пакета конфигурации в первую очередь (легкий доступ к преобразованным типам и проверенной информации о конфигурации без большого количества шаблонов). код).

Итак, есть ли способ использовать System.Configuration в поточно-ориентированном режиме, не прибегая к избыточному анализу и выделению разделов конфигурации? Осуществляет ли ваша собственная ConfigurationSection освобождение от отсутствия гарантии, предоставляемой Microsoft, несмотря на то, что вы получаете к ней доступ через интерфейсы System.Configuration (и если да, то как бы вы реализовали ее как поточно-ориентированную при доступе к базе Для доступа к сконфигурированным данным требуется индексатор ConfigurationSection)?

Ответы [ 2 ]

5 голосов
/ 14 апреля 2009

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

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

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

0 голосов
/ 14 апреля 2009

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

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

...