用户作用域应用程序设置(在VS设计器中创建)线程是否安全?

时间:2011-11-20 10:55:46

标签: c# application-settings thread-synchronization

我在visual studio项目中创建了应用程序设置,包含用户范围设置和应用程序范围设置。我的应用程序有几个线程可以同时访问设置以进行读取或写入。我搜索过MSDN,看看用户可以在运行时更新的作用域设置是否是线程安全的,但找不到明确的答案。有人知道吗?

提前致谢!

2 个答案:

答案 0 :(得分:3)

线程安全不仅仅是“这会破坏数据结构。”

在设置环境中,您需要考虑三种不同的含义。设置数据结构在其中一个中是安全的,但在其他两个中则不安全。

  1. 设置和阅读单个值
  2. 同时设置和读取多个值,获取或设置一致的图片
  3. 在设置值之前,使用当前值计算新值
  4. 在第一种情况下,是的,设置数据结构是线程安全的。您将无法在设置中写入半Int64,并冒险让另一个线程观察到该中途值。

    但是,如果您按顺序设置多个值,则无法保证另一个线程无法读取两个此类set语句之间的所有设置,观察一个更改,而不是另一个。

    换句话说,您可以拥有以下场景:

    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
    

    对于后两种情况,您需要一个可以锁定的外部同步对象,以确保您没有进行中途更改或丢失更改,但是以这种方式访问​​设置的所有代码都需要锁定那个对象。

答案 1 :(得分:0)

Visual Studio应用程序设置设计器生成的包装器是一个带有索引器的同步单例,它将以线程安全的方式获取和设置应​​用程序设置属性。