Может ли кеш (или другие переменные) изменяться во время выполнения кода?
Это может быть просто теоретический вопрос, но я не смог найти удовлетворительного ответа на него.
Я использую кеш на одном из моих сайтов, который заставил меня задуматься о том, что это за данные и когда и если они изменятся. Может ли кеш меняться при выполнении какого-то кода?
Вот пример
if (Cache["name"] != null) {
// Long and heavy code execution done here
if (Cache["name"] == null) Response.Write("Lost the data");
}
Может ли процесс, который изменяет кэш, работать параллельно с приведенным выше кодом или он ожидает завершения?
Есть ли теоретический шанс, что это напечатало бы "Потерянные данные"?
Если да, то всегда ли полезно сначала сохранять переменную или всегда проверять на ноль, а не на ноль?
Заранее спасибо!
/ Никлас
2 ответа
Абсолютно это может.
Всегда снимайте значения из кэша и работайте со снимком:
var snapshot = Cache["name"];
if(snapshot != null) {...}
и использовать snapshot
на протяжении. Когда дело доходит до многопоточности, вышеупомянутое - обычно здравый подход; единственное предостережение, которое вы можете захотеть посмотреть на Interlocked
для ряда методов, которые позволяют (безопасно) увидеть, изменилась ли переменная / поле, пока вы не искали, и применить только то изменение, которое не изменилось.
Конечно, он может истечь, так что проверка на ноль должна быть сделана перед его использованием. И, как вы сказали, сохранение сохраненной копии для работы - это хорошо.