ConcurrentBag<T>クラス

このクラスは、オブジェクトを格納する順序が問題とならないときに適しています。また、重複に対応します。Remarks - ConcurrentBag<T> Class (System.Collections.Concurrent) | Microsoft Learn

ConcurrentBag<int> cb = new ConcurrentBag<int>();
cb.Add(1);
cb.Add(2);
cb.Add(3);
// cbには 3, 2, 1 の順で格納される

int result;
bool ret1 = cb.TryTake(out result); // resultには 3が格納される
bool ret2 = cb.TryPeek(out result); // resultには 2が格納される
bool ret3 = cb.TryPeek(out result); // resultには 2が格納される

複数のスレッドから追加や削除をした場合、順番はこの通りとは限りません。c# - What is the difference between ConcurrentBag and ConcurrentStack? - Stack Overflow

メソッド

メソッド 機能
Add(T) オブジェクトを、追加する
TryTake(T) オブジェクトを、削除して取得を試みる
TryPeek(T) オブジェクトを、削除せずに取得を試みる
   

Add()

public void Add (T item);
ConcurrentBag<T>.Add(T) メソッド (System.Collections.Concurrent) | Microsoft Learn

TryTake(T)

オブジェクトを削除して返すように指示できます。

public bool TryTake (out T result);
ConcurrentBag<T>.TryTake(T) メソッド (System.Collections.Concurrent) | Microsoft Learn

削除されたオブジェクトがresultに格納されます。バッグが空ならば、Tの既定値が格納されます。

削除できたならばtrueが返されます。

Microsoft Learnから検索