Да, это потокобезопасно, и да позволяет избежать повсеместного использования блокировок (что бы это ни значило). Конечно, это обеспечит вам потокобезопасный доступ к данным, хранящимся в этом словаре, но если сами данные не являются поточно-ориентированными, то вам, конечно, нужно синхронизировать доступ к ним. Представьте, например, что вы сохранили в этом кэше List
. Теперь thread1 выбирает этот список (потокобезопасным способом, так как параллельный словарь гарантирует вам это), а затем начинает перечисление по этому списку. В то же самое время thread2 выбирает тот же самый список из кэша (потокобезопасным способом, поскольку параллельный словарь гарантирует вам это) и записывает в список (например, добавляет значение). Вывод: если вы не синхронизировали thread1, это приведет к проблемам.
Что касается использования его в качестве кеша, то, вероятно, это не очень хорошая идея. Для кеширования я бы порекомендовал вам то, что уже встроено в фреймворк. Классы, такие как MemoryCache , например. Причиной этого является то, что то, что встроено в сборку System.Runtime.Caching
, хорошо, явно построено для кэширования => оно обрабатывает такие вещи, как автоматическое истечение срока действия данных, если у вас заканчивается нехватка памяти, обратные вызовы для кеша элементы истечения срока действия, и вы даже сможете распределить свой кэш по нескольким серверам, используя такие вещи, как memcached, AppFabric, ..., все, о чем вы не могли бы и мечтать, используя параллельный словарь.
Запустите сеанс до начала буферизации вывода. Итак, переключите вызовы ob_start ()
и session_start ()
.
Поскольку файлы cookie сеанса определены в заголовках, отправляемых в браузер, а заголовки отправляются в браузер, когда вы запустить буфер, вы должны запустить сеансы до буфера.
Приведенный вами пример должен работать. Возможно, вам мешает какой-то сеансовый кеш. Вы можете попробовать изменить свой код следующим образом:
if (isset($_SESSION['invite_errors']) && $_SESSION['invite_errors']) {
$error = $_SESSION['invite_errors'];
$_SESSION['invide_errors'] = false;
unset($_SESSION['invite_errors']);
// Explicitly write and close the session for good measure
session_write_close();
}
Возможно, вы сможете изменить значение после того, как отобразите ошибку
if (isset($_SESSION['invite_error'])) {
echo $_SESSION['invite_error'];
$_SESSION['invite_error'] = null;
unset($_SESSION['invite_error']);
}