私はConfiguration
というクラスを持っていますが、これはデータベースからロードされた値で更新されるいくつかのプロパティを持っています。
私は、イベントハンドラがプライベートメソッドに加入しているConfiguration
コンストラクタにデータトリガイベントOnDataChanged
を持っています。
Configuration
の同じインスタンスが複数のスレッドによって使用されます。C#スレッドセーフでインスタンスを更新していますか?
OnDataChanged
イベントが発生し、プライベートメソッドが呼び出され、このプライベートメソッド内で、Configuration
プロパティをデータベースの最新のデータで更新するため、すでにインスタンスを使用しているスレッドが更新されたデータを持つ。
これはスレッドセーフですか?
どうすればこのスレッドセーフにすることができますか?私はロックを使用していません。
編集:
追加するサンプルコード:
他の人がコメントしたようにpublic class Configuration
{
private GeneralConfiguration _generalConfiguration;
private AccountConfiguration _accountConfiguration;
private readonly SqlTableDependency<Model> _dependency;
public Configuration()
{
_dependency = new SqlTableDependency<Model>("connectionstring", "dbo.Configuration");
_dependency.OnChanged += _dependency_OnChanged;
_dependency.Start();
}
private void _dependency_OnChanged(object sender, RecordChangedEventArgs<Model> e)
{
Init();
}
private Configuration Init()
{
DataAccess da = new DataAccess();
List<string> configs = da.GetConfigData();
_generalConfiguration = JsonConvert.Deserialize<GeneralConfiguration>(configs[0]);
_accountConfiguration = JsonConvert.Deserialize<AccountConfiguration>(configs[1]);
return this;
}
public GeneralConfiguration GeneralConfiguration { get { return _generalConfiguration; } }
public AccountConfiguration AccountConfiguration { get { return _accountConfiguration; } }
}
コードサンプルを提供してください – mayu
_ "私はロックを使用していません" _確かにあなたにヒントを与えますか? – MickyD
自分で開く問題は、使用しているデータの種類によって多少異なります。 .Netの少なくともいくつかのバージョンでは、すべての変数の読み込み/書き込みがアトミックであるわけではありません。つまり、別のスレッドが書き込んでいる間に1つのスレッドが読み取れば、読み取り側は古い値の一部である値を取得し、非原子的参照の例)。 [変数参照の不可分性](https://msdn.microsoft.com/en-us/library/aa691278(v = vs.71).aspx)適切なロックを実装するだけです。 – hatchet