Пользователь
Добавлю, что разработчики дотнета знают о подобной проблеме, поэтому, например, у ConcurrentDictionary (который довольно часто выступает в роли in-memory кэша) есть методы
TValue GetOrAdd(TKey key, Func<TKey, TValue> valueFactory)
TValue GetOrAdd<TArg>(TKey key, Func<TKey, TArg, TValue> valueFactory, TArg factoryArgument)
Это позволяет не захватить в замыкание не только ключ, но и дополнительный аргумент, если это нужно.
Добавлю, что разработчики дотнета знают о подобной проблеме, поэтому, например, у ConcurrentDictionary (который довольно часто выступает в роли in-memory кэша) есть методы
TValue GetOrAdd(TKey key, Func<TKey, TValue> valueFactory)
TValue GetOrAdd<TArg>(TKey key, Func<TKey, TArg, TValue> valueFactory, TArg factoryArgument)
Это позволяет не захватить в замыкание не только ключ, но и дополнительный аргумент, если это нужно.