Хорошо, я был немного не уверен, как лучше назвать эту проблему :) Но предположим, что в этом сценарии вы выходите и получаете какую-то веб-страницу (с различными URL-адресами) и кешируете ее локально.Часть кеша довольно легко решить даже с несколькими потоками.
Однако представьте, что один поток начинает извлекать URL-адрес, а через пару миллисекунд другой хочет получить тот же URL-адрес.Есть ли хороший способ заставить метод секундного потока ждать, пока первый извлечет страницу, вставить ее в кеш и вернуть, чтобы вам не приходилось выполнять несколько запросов.С небольшими накладными расходами, которые стоит делать даже для запросов, которые занимают около 300-700 мс?И без блокирования запросов на другие URL
В основном, когда запросы на идентичные URL-адреса поступают тесно друг за другом, я хочу, чтобы второй запрос «совмещал» первый запрос
У меня было какое-то дурное представление о том, чтословарь, в который вы вставляете объект с ключом в качестве URL, когда вы начинаете извлекать страницу и блокируете ее.Если уже есть какой-либо соответствующий ключ, он получает объект, блокирует его и затем пытается извлечь URL для фактического кэша.
Я немного не уверен в деталях, однако, чтобы сделать его действительно потокобезопаснымиспользование ConcurrentDictionary может быть одной из его частей ...
Существует ли какой-либо общий шаблон и решения для подобных сценариев?
Неправильное поведение с разбивкой:
Поток 1: проверкикеша, он не существует, поэтому начинает извлекать URL
Поток 2: начинает извлекать тот же URL, поскольку он все еще не существует в Cache
Поток 1: завершен и вставляется в кеш,возвращает страницу
Поток 2: завершает, а также вставляет в кэш (или удаляет его), возвращает страницу
Правильное поведение разбивки:
Поток 1: проверяет кэш,он не существует, поэтому начинает извлекать URL-адрес
Поток 2: хочет тот же URL-адрес, но видит, что он в настоящее время извлекается, поэтому ожидает в потоке 1
Поток 1: завершен и вставляет iв кэш возвращает страницу
Поток 2: замечает, что поток 1 завершен, и возвращает поток страницы 1, который он выбрал
РЕДАКТИРОВАТЬ
БольшинствоРешения sofar, кажется, неправильно понимают проблему и обращаются только к кешированию, поскольку я сказал, что это не проблема, проблема заключается в том, что при выполнении внешней выборки через Интернет выполняется вторая выборка , которая выполняется до того, как первая кэширует ее использовать результат первого, а не второго