Skip to content

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

Open

Description

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!

Activity

  1. trivalik commented on Apr 29, 2025

    @trivalik

    The only way I could that this fails (without testing) is in WinForms. But then the call would be on UI thread, what stops me thinking this. Could you provide a repo which allows to reproduce?

Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment

Metadata

Metadata

Assignees

No one assigned

    Labels

    No labels
    No labels

    Type

    No type

    Projects

    No projects

      Milestone

      No milestone

      Relationships

      None yet

      Development

      No branches or pull requests

      Issue actions