Как реализовать «single-flight» асинхронный кэш в C#, чтобы при наплыве запросов по одному ключу выполнялась ровно одна загрузка?
Держите ConcurrentDictionary<TKey, Lazy<Task<T>>>: через GetOrAdd публикуйте один общий Lazy<Task<T>> на ключ (режим ExecutionAndPublication) и await его. При отмене/ошибке — удаляйте запись, чтобы следующая попытка перезапустила загрузку. Добавьте TTL/лимиты (например, IMemoryCache), фоновые обновления, per-request CancellationToken, не кэшируйте исключения и следите за размерами/метриками промахов. Альтернатива — пер-ключевой SemaphoreSlim/lock для объединения запросов.
Библиотека собеса по С#
Post #890
1.47K
- ❤ 3
- 😢 1