Подтвердить что ты не робот

Является ли MemoryCache.Set() потокобезопасным?

Документация MSDN для MemoryCache.Set, к сожалению, не указывает явно, является ли она потокобезопасной или нет.

Можно ли использовать .Get() и .Set() из нескольких потоков без явной блокировки?

4b9b3361

Ответ 1

Да, класс MemoryCache является потокобезопасным:

System.Runtime.Caching.MemoryCache является потокобезопасным. Несколько одновременных потоки могут читать и записывать экземпляр MemoryCache. внутренне безопасность потоков автоматически обрабатывается, чтобы обеспечить обновление кеша последовательно.

Что это может означать, так это то, что данные, хранящиеся в кеше может сама по себе не быть потокобезопасной. Например, если список помещен в кеш и два отдельных потока получают ссылку на кешированный Перечислите, что два потока будут наступать друг на друга, если они оба пытаются обновить список одновременно.

При этом методы Get и Set являются потокобезопасными, но если структура данных, которую вы можете хранить в этом кеше, не является потокобезопасной, вы можете столкнуться с проблемами. Представьте, например, что вы сохранили словарь в этом кеше. Затем в то время как thread1 использует Get для извлечения словаря и начинает его читать, thread2 использует Get для извлечения этого же словаря и пытается записать на него. Пока операция Get будет потокобезопасной, что будет дальше, может быть довольно неприятно.

Ответ 2

В документации для MemoryCache указано:

Этот тип является потокобезопасным.