Я получил этот объект кэширования síngleton, и он предоставляет свойство IEnumerable, которое возвращает частную переменную IEnumerable.Обновление ссылки на переменную-член, которая используется
У меня есть статический метод для моего объекта singleton, который обновляет эту переменную-член (которая существует в экземпляре экземпляра «экземпляр» этого объекта кеша).
Предположим, что какой-то поток в настоящее время выполняет итерацию над этой переменной IEInumable/свойство, когда мой кеш обновляется. Я сделал так, чтобы кеш обновлялся по новой локальной переменной и, наконец, установил открытую закрытую переменную, чтобы указать на эту новую локальную переменную.
Я знаю, что я просто обновляю ссылку, оставляя другой (старый) объект в памяти ожидающим, чтобы его подхватил 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
}
}
Экземпляр, который он перечисляет, не обязательно должен быть новым (и ключевым словом volatile)? Я имею в виду, что я сделал его IEnumerable, чтобы он ничего не мог с этим поделать, или я что-то пропустил здесь? – 2008-09-22 10:49:30