idempotent value creation #153
Merged
Add this suggestion to a batch that can be applied as a single commit.
This suggestion is invalid because no changes were made to the code.
Suggestions cannot be applied while the pull request is closed.
Suggestions cannot be applied while viewing a subset of changes.
Only one suggestion per line can be applied in a batch.
Add this suggestion to a batch that can be applied as a single commit.
Applying suggestions on deleted lines is not supported.
You must change the existing code in this line in order to create a valid suggestion.
Outdated suggestions cannot be applied.
This suggestion has been applied or marked resolved.
Suggestions cannot be applied from pending reviews.
Suggestions cannot be applied on multi-line comments.
Suggestions cannot be applied while the pull request is queued to merge.
Suggestion cannot be applied right now. Please check back later.
Provide building blocks to synchronize cache value factories in order to mitigate a cache stampede.
In each case below, multiple threads calling GetValue equivalents will be synchronized such that only a single thread runs at a time and the others see the result of the winning thread:
If an exception is thrown, it is not cached. Intent is to mimic behavior of ConcurrentDictionary.GetOrAdd. In the case of the async variants, the result of the single failing task can be seen by other threads if they attempt to create a value while it is running. Once it is finished, a new attempt can be made.
This would probably need to be extended to include some parameterization of the lock timeout. This would require switching to Monitor.TryEnter.