Как реализовать «single-flight» асинхронный кэш в C#, чтобы при наплыве запросов по одному ключу выполнялась ровно одна загрузка?
Держите ConcurrentDictionary<TKey, Lazy<Task<T>>>: через GetOrAdd публикуйте один общий Lazy<Task<T>> на ключ (режим ExecutionAndPublication) и await его. При отмене/ошибке — удаляйте запись, чтобы следующая попытка перезапустила загрузку. Добавьте TTL/лимиты (например, IMemoryCache), фоновые обновления, per-request CancellationToken, не кэшируйте исключения и следите за размерами/метриками промахов. Альтернатива — пер-ключевой SemaphoreSlim/lock для объединения запросов.
Как реализовать «single-flight» асинхронный кэш в C#, чтобы при наплыве запросов по одному ключу выполнялась ровно одна загрузка?
Держите ConcurrentDictionary<TKey, Lazy<Task<T>>>: через GetOrAdd публикуйте один общий Lazy<Task<T>> на ключ (режим ExecutionAndPublication) и await его. При отмене/ошибке — удаляйте запись, чтобы следующая попытка перезапустила загрузку. Добавьте TTL/лимиты (например, IMemoryCache), фоновые обновления, per-request CancellationToken, не кэшируйте исключения и следите за размерами/метриками промахов. Альтернатива — пер-ключевой SemaphoreSlim/lock для объединения запросов.
The Channel name and bio must be no more than 255 characters long Users are more open to new information on workdays rather than weekends. The court said the defendant had also incited people to commit public nuisance, with messages calling on them to take part in rallies and demonstrations including at Hong Kong International Airport, to block roads and to paralyse the public transportation system. Various forms of protest promoted on the messaging platform included general strikes, lunchtime protests and silent sit-ins. How to create a business channel on Telegram? (Tutorial) Write your hashtags in the language of your target audience.
from us