我已经在我的Visual Studio项目中创建了应用程序设置,包括用户范围的设置和应用程序范围的设置。我的应用程序有几个线程可能同时访问这些设置进行读取或写入。我搜索了MSDN以查看可以在运行时更新的用户范围设置是否是线程安全的,但没有找到明确的答案。有人知道吗?
提前感谢!
提前感谢!
线程安全不仅仅是指“这会损坏数据结构”。
在设置中,有三个不同的含义需要考虑。其中一个可以保证设置数据结构的安全性,但其他两个则不能。
在第一种情况下,是的,设置数据结构是线程安全的。您将无法将一半的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
针对后两种情况,您需要一个外部同步对象,以便您可以锁定它,以确保不会受到中途更改的影响或丢失更改,但是所有以这种方式访问设置的代码都需要锁定该对象。
Visual Studio 应用程序设置设计器生成的包装器是一个同步单例,带有索引器,可以以线程安全的方式获取和设置应用程序设置属性。
int current = Settings.Default.SomeIndex; current++; Settings.Default.SomeIndex = current; Settings.Default.Save();
- Lasse V. Karlsen