Skip to content
New issue

Have a question about this project? Sign up for a free GitHub account to open an issue and contact its maintainers and the community.

By clicking “Sign up for GitHub”, you agree to our terms of service and privacy statement. We’ll occasionally send you account related emails.

Already on GitHub? Sign in to your account

An item with the same key has already been added issue - .NET 8.0 #1452

Open
stefano-venturini-zucchetti opened this issue Oct 28, 2024 · 0 comments

Comments

@stefano-venturini-zucchetti

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!

Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment
Labels
None yet
Projects
None yet
Development

No branches or pull requests

1 participant