c# 如何从ConcurrentBag中删除所有项目?



2 Answers

更新10/03/2017:正如@Lou正确指出的那样,赋值是原子的。 在这种情况下, ConcurrentBag创建将不是原子的,但将该引用放入变量是原子的 - 因此不严格要求锁定或Interlocked.Exchange

进一步阅读:

引用赋值是原子的,为什么需要Interlocked.Exchange(ref Object,Object)?

参考分配线程安全吗?

您始终可以锁定对包本身的访问权限并创建它的新实例。 如果没有其他东西可以保留在GC中,那么袋子中的物品将是合格的:

lock (something)
{
    bag = new ConcurrentBag();
}

或者像Lukazoid指出的那样:

var newBag = new ConcurrentBag();
Interlocked.Exchange<ConcurrentBag>(ref bag, newBag);

然而,这样就可以轻松地对内容进行分区,这假设每当一个项目需要访问时它也会获得锁定 - 这可能很昂贵并且可能会抵消已经进入ConcurrentBag本身的性能调整。

如果你知道此时没有其他任何东西可以进入行李箱,那么请不要锁定它并且不要锁定:-)

c# concurrency

如何清除ConcurrentBag ? 它没有像ClearRemoveAll这样的方法......




您可以在循环中逐个删除对象:

object result;
while (bag.TryTake(out result));

请注意,在循环之后bag不保证是空的,因为可以在循环完成之后和不同线程的下一个语句之前添加项。




Related