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

3
我已经在我的Visual Studio项目中创建了应用程序设置,包括用户范围的设置和应用程序范围的设置。我的应用程序有几个线程可能同时访问这些设置进行读取或写入。我搜索了MSDN以查看可以在运行时更新的用户范围设置是否是线程安全的,但没有找到明确的答案。有人知道吗?
提前感谢!

这取决于您在此处所指的线程安全性。在以下情况下,它们不是线程安全的:int current = Settings.Default.SomeIndex; current++; Settings.Default.SomeIndex = current; Settings.Default.Save(); - Lasse V. Karlsen
2个回答

3

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

在设置中,有三个不同的含义需要考虑。其中一个可以保证设置数据结构的安全性,但其他两个则不能。

  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

针对后两种情况,您需要一个外部同步对象,以便您可以锁定它,以确保不会受到中途更改的影响或丢失更改,但是所有以这种方式访问设置的代码都需要锁定该对象。


我只有第一个场景 :) - user1039580

0

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


网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接