Я получил этот объект кэша síngleton, и он предоставляет свойство IEnumerable, которое просто возвращает приватную переменную IEnumerable.
У меня есть статический метод в моем одноэлементном объекте, который обновляет эту переменную-член (которая существует в единственном экземпляре 'Instance' этого объекта кэша).
Допустим, какой-то поток в настоящее время перебирает эту переменную / свойство 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
}
}