ユーザー スコープの設定とアプリケーション スコープの設定の両方を含む、Visual Studio プロジェクトでアプリケーション設定を作成しました。私のアプリケーションには、読み取りまたは書き込みの設定に同時にアクセスできる複数のスレッドがあります。MSDN を検索して、実行時に更新できるユーザー スコープの設定がスレッド セーフかどうかを確認しましたが、明確な答えが見つかりませんでした。誰か知っていますか?
前もって感謝します!
ユーザー スコープの設定とアプリケーション スコープの設定の両方を含む、Visual Studio プロジェクトでアプリケーション設定を作成しました。私のアプリケーションには、読み取りまたは書き込みの設定に同時にアクセスできる複数のスレッドがあります。MSDN を検索して、実行時に更新できるユーザー スコープの設定がスレッド セーフかどうかを確認しましたが、明確な答えが見つかりませんでした。誰か知っていますか?
前もって感謝します!
スレッド セーフは、単に「これによってデータ構造が破損するかどうか」だけではありません。
設定のコンテキストでは、考慮する必要がある 3 つの異なる意味があります。設定データ構造は、そのうちの 1 つで安全ですが、他の 2 では安全ではありません。
最初のケースでは、はい、設定データ構造はスレッドセーフです。半分の Int64 を設定に書き込むことはできず、別のスレッドがその半分の値を監視する危険があります。
ただし、複数の値を順番に設定している場合、別のスレッドがそのような 2 つの set-statement 間のすべての設定を読み取ることができないという保証はありません。
つまり、次のシナリオを使用できます。
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
後者の 2 つのシナリオでは、途中で変更を取得したり、変更を失ったりしないようにロックできる外部同期オブジェクトが必要ですが、この方法で設定にアクセスするすべてのコードは、そのオブジェクトをロックする必要があります。
Visual Studio アプリケーション設定デザイナーによって生成されるラッパーは、アプリケーション設定プロパティをスレッドセーフな方法で取得および設定するインデクサーを備えた同期シングルトンです。