-
Notifications
You must be signed in to change notification settings - Fork 68
Open
Labels
bugMarks an issue as a critical bug that needs to be fixed ASAP.Marks an issue as a critical bug that needs to be fixed ASAP.
Description
ConcurrentBag is an unordered collection therefore attempting to remove spesific item can cause infinite loop and ConcurrentBag<>.TryTake can return null value.
Network/Network/Extensions/ConcurrentBagExtensions.cs
Lines 21 to 34 in a3201d9
| 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
Labels
bugMarks an issue as a critical bug that needs to be fixed ASAP.Marks an issue as a critical bug that needs to be fixed ASAP.