FYI, if you plan to do this in ASP netcore, combine with AsyncLazy for the most optimal results
https://github.com/davidfowl/AspNetCoreDiagnosticScenarios/b...
To further explain why you want to use an AsyncLazy (or Lazy for synchronous programming) when working with ConcurrentDictionary I find this article to be helpful: https://andrewlock.net/making-getoradd-on-concurrentdictiona...