Skip to content

possible infinite loop problem at runtime #94

@acard0

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);
    }
}

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