Обновление 10/03/2017: Как правильно указывает @Lou, назначение является атомарным. В этом случае создание ConcurrentBag
не будет атомарным, но помещение этой ссылки в переменную будет атомарным - так что блокировка или Interlocked.Exchange
вокруг нее строго не требуется.
Некоторое дальнейшее чтение:
присвоение ссылки является атомарным, так зачем нужен Interlocked.Exchange (ref Object, Object)?
Является ли справочное назначение безопасным для потоков?
<Ч />
Вы всегда можете заблокировать доступ к самой сумке и создать ее новый экземпляр. Предметы в сумке будут тогда понятны для GC, если на них ничего не держится:
lock (something)
{
bag = new ConcurrentBag();
}
Или, как указывает Луказоид:
var newBag = new ConcurrentBag();
Interlocked.Exchange<ConcurrentBag>(ref bag, newBag);
Простой способ связать содержимое, однако, это предполагает, что всякий раз, когда элемент хочет получить доступ, он также получает блокировку - это может быть дорого и может свести на нет настройку производительности, которая вошла в саму ConcurrentBag
.
Если вы знаете, что больше ничего не получит доступ к сумке в это время, молитесь за нее и не запирайте: -)