多くのクライアントがアクセスするカスタム オブジェクトをホストしている WCF アプリケーションを開発中です。基本的には機能していますが、何千もの同時クライアントを処理する必要があるため、同時読み取り呼び出しを処理できるサービスが必要です (更新は頻繁ではありません)。オブジェクトの更新中にプライベート フィールドをロックすることで、スレッド セーフを追加しました。
[ServiceBehavior(ConcurrencyMode = ConcurrencyMode.Multiple)]
public sealed class TestServerConfig : ConfigBase, ITestInterface
{
private object updateLock = new object();
private SortedList<string, DateTime> dates = new SortedList<string, DateTime>();
public DateTime GetDate(string key)
{
if (this.dates.ContainsKey(key))
{
return this.dates[key];
}
else
{
return DateTime.MinValue;
}
}
public void SetDate(string key, DateTime expirationDate)
{
lock (this.updateLock)
{
if (this.dates.ContainsKey(key))
{
this.dates[key] = expirationDate;
}
else
{
this.dates.Add(key, expirationDate);
}
}
}
}
私の問題は、GetDate への同時呼び出しを実行できるように、ロックせずに GetDate スレッドを安全にする方法ですが、チェック後、値が読み取られる前にコレクションから値が削除されたときに例外がランダムに発生することはありません。
例外をキャッチして処理することは可能ですが、それでも回避したいと思います。
何か案は?