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