This repo is the official home of .NET on GitHub. It's a great starting point to find many .NET OSS projects from Microsoft and the community, including many that are part of the .NET Foundation.
I'm experiencing an unexpected behavior with a Dictionary<(int, int), int> that is intended to act as a cache. Despite implementing a locking mechanism to ensure thread safety, I encounter a duplicate key exception when attempting to add an entry to the dictionary.
Here is the relevant code snippet:
private readonly Dictionary<(int, int), int> _hashCodeCausalTypeCache = new Dictionary<(int, int), int>();
private readonly object _lockObj = new object();
.........................
lock (_lockObj)
{
if (_hashCodeCausalTypeCache.TryGetValue(key, out var value))
{
causalType = value;
}
else
{
var dataTable = Globals.SelectDataTable(@$"SELECT ac.causal_type
FROM trans_articles ta
LEFT JOIN article_causals ac ON ac.id = ta.causal_id
WHERE ta.transaction_id = {transactionId} AND ta.hash_code = {hashCode}");
if (dataTable == null || dataTable.Rows == null || dataTable.Rows.Count == 0)
{
return;
}
causalType = SafeConvert.ToInt32(dataTable.Rows[0]["causal_type"]);
_hashCodeCausalTypeCache.Add(key, causalType);
}
}
Issue Details:
The first TryGetValue check returns false, allowing the addition of a new entry to the dictionary.
However, immediately afterward, I encounter a duplicate key exception when attempting to add the same key, even though it was not found in the first check.
There are no multi-threading issues involved in this scenario, and the cache is managed in a single thread.
I would appreciate any insights into why this might be occurring and any potential solutions to resolve this issue. Thank you!
I'm experiencing an unexpected behavior with a
Dictionary<(int, int), int>
that is intended to act as a cache. Despite implementing a locking mechanism to ensure thread safety, I encounter a duplicate key exception when attempting to add an entry to the dictionary.Here is the relevant code snippet:
Issue Details:
TryGetValue
check returnsfalse
, allowing the addition of a new entry to the dictionary.I would appreciate any insights into why this might be occurring and any potential solutions to resolve this issue. Thank you!