Skip to content

possible infinite loop problem at runtime #94

Open

Description

@acard0

ConcurrentBag is an unordered collection therefore attempting to remove spesific item can cause infinite loop and ConcurrentBag<>.TryTake can return null value.

public static void Remove<T>(this ConcurrentBag<T> bag, T item)
{
while (bag.Count > 0)
{
bag.TryTake(out T result);
if (result.Equals(item))
{
break;
}
bag.Add(result);
}
}

Test case (.NET 6.0);

var bag = new ConcurrentBag<string>();
bag.Add("hi");
bag.Add("123");

var time = DateTime.Now;

// works
Console.WriteLine($"Attempting to remove item: {bag.First()}");
Remove(bag, bag.ElementAt(0));
Console.WriteLine($"Deltatime is : {(DateTime.Now - time).TotalMilliseconds}ms");

// fails
Console.WriteLine($"Attempting to remove item: {bag.First()}");
Remove(bag, bag.ElementAt(1));
Console.WriteLine($"Deltatime is : {(DateTime.Now - time).TotalMilliseconds}ms");

void Remove<T>(ConcurrentBag<T> bag, T item)
{
    while (bag.Count > 0)
    {
        bag.TryTake(out T result);

        if (result.Equals(item))
        {
            break;
        }

        bag.Add(result);
    }
}

Activity

  1. added
    bugMarks an issue as a critical bug that needs to be fixed ASAP.
    on Mar 27, 2023
  2. Toemsel commented on Mar 27, 2023

    @Toemsel
    Owner

    Yes, you are completely right! Thanks for the report!

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

    bugMarks an issue as a critical bug that needs to be fixed ASAP.

    Projects

    No projects

      Milestone

      No milestone

      Relationships

      None yet

      Development

      No branches or pull requests

      Issue actions