我已在Visual Studio項目中創建了應用程序設置,其中包含用戶範圍設置和應用程序範圍設置。我的應用程序有幾個線程可以同時訪問設置以進行讀取或寫入。我搜索了MSDN,看是否可以在運行時更新的用戶範圍設置是線程安全的,但無法找到明確的答案。有人知道嗎?用戶範圍的應用程序設置(在VS設計器中創建)是否安全?
在此先感謝!
我已在Visual Studio項目中創建了應用程序設置,其中包含用戶範圍設置和應用程序範圍設置。我的應用程序有幾個線程可以同時訪問設置以進行讀取或寫入。我搜索了MSDN,看是否可以在運行時更新的用戶範圍設置是線程安全的,但無法找到明確的答案。有人知道嗎?用戶範圍的應用程序設置(在VS設計器中創建)是否安全?
在此先感謝!
由Visual Studio應用程序設置設計器生成的包裝是一個索引,將得到和在一個線程安全的方式設置應用程序設置的屬性同步單。
線程安全不僅僅是「這會損壞數據結構」。
在設置環境中,您需要考慮三個不同的含義。其中一個設置數據結構是安全的,但其他兩個不是。
在第一種情況下,是的,設置數據結構是線程安全的。您將無法在設置中寫入半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
這取決於你在這裏所說的線程安全。在以下場景中它們不是線程安全的:'int current = Settings.Default.SomeIndex;當前++; Settings.Default.SomeIndex = current; Settings.Default.Save();' –