このシングルキャッシュオブジェクトを取得しました。これにより、プライベートIEnumerable変数を返すだけのIEnumerableプロパティが公開されます。
このメンバー変数(このキャッシュオブジェクトの単一の「インスタンス」インスタンスに存在する)を更新する静的メソッドがシングルトンオブジェクトにあります。
キャッシュが更新されている間、あるスレッドが現在このIEnumerable変数/プロパティを反復処理しているとしましょう。キャッシュが新しいローカル変数で更新され、最後に公開されたプライベート変数がこの新しいローカル変数を指すように設定されるようにしました。
参照を更新しているだけで、メモリ内の他の(古い)オブジェクトがGCによって取得されるのを待っていることはわかっていますが、問題は、新しい参照を設定するとどうなるか100%わからないということです。他のスレッドが突然、新しいオブジェクトまたはIEnumerableインターフェイスを通過した古いオブジェクトを反復処理しますか?それが通常の参照であったなら、私は「いいえ」と言うでしょう。呼び出し元のスレッドは古いオブジェクトで動作しますが、これがIEnumerableにも当てはまるかどうかはわかりません。
削除されたクラスは次のとおりです。
internal sealed class SektionCache : CacheBase
{
public static readonly SektionCache Instance = new SektionCache();
private static readonly object lockObject = new object();
private static bool isUpdating;
private IEnumerable<Sektion> sektioner;
static SektionCache()
{
UpdateCache();
}
public IEnumerable<Sektion> Sektioner
{
get { return sektioner; }
}
public static void UpdateCache()
{
// SNIP - getting data, locking etc.
Instance.sektioner = newSektioner;
// SNIP
}
}