ConcurrentDictionary.GetOrAdd can run your value factory more than once when threads race on the same key. Only one result is kept, but the extra factories still execute. Here's the race and the one-line Lazy fix.
My ConcurrentDictionary cache was all hits, yet it churned the GC. The GetOrAdd factory closed over a loop-local, so it allocated a closure on every call even though the factory never ran. The state-arg overload does the same work at zero bytes.