Насколько безопасны для пользователя параметры приложения (созданные в конструкторе VS)? - PullRequest
2 голосов
/ 20 ноября 2011

Я создал настройки приложения в своем проекте Visual Studio, который содержит как параметры области пользователя, так и параметры области приложения.Мое приложение имеет несколько потоков, которые могут получить доступ к настройкам для чтения или записи одновременно.Я искал MSDN, чтобы увидеть, являются ли параметры области действия пользователя, которые могут быть обновлены во время выполнения, потокобезопасными, но не смог найти определенный ответ.Кто-нибудь знает?

Заранее спасибо!

Ответы [ 2 ]

3 голосов
/ 20 ноября 2011

Потокобезопасность - это гораздо больше, чем просто «это повредит структуру данных».

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

  1. Установка и считывание отдельных значений
  2. Установка и считывание нескольких значений одновременно, получение или установка согласованного изображения
  3. Корректировка значения с использованием его текущего значения для расчета нового перед его восстановлением

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

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

Другими словами, у вас может быть такой сценарий:

Thread 1                       Thread 2
set setting 1
                               read setting 1
                               read setting 2
set setting 2

А в случае чтения значения, вычисления нового значения из прочитанного вами значения и его установки обратно, нет никакой гарантии, что другой поток не сможет сделать то же самое (т. Е. Изменить текущее значение) тем временем.

Как это:

Thread 1                       Thread 2
read setting 1
                               read setting 1
                               calculate new value
                               write setting 1
calculate new value
write setting 1

Для последних двух сценариев вам необходим внешний объект синхронизации, который вы можете заблокировать, чтобы гарантировать, что вы не получаете изменения на полпути или не теряете изменения, но тогда весь код, обращающийся к настройкам таким образом, должен будет блокироваться этот объект.

0 голосов
/ 20 ноября 2011

Оболочка, созданная конструктором параметров приложений Visual Studio, представляет собой синхронизированный одноэлементный узел с индексатором, который будет получать и задавать свойства параметров приложения в поточно-ориентированном режиме.

...