如何清除ConcurrentBag
?它没有任何类似的方法Clear
or RemoveAll
...
2017 年 10 月 3 日更新:正如@Lou 正确指出的那样,赋值是原子的。在本例中,创建ConcurrentBag
不会是原子的,但将该引用放入变量中will是原子的 - 所以锁定或Interlocked.Exchange
周围没有严格要求。
一些进一步阅读:
引用分配是原子的,那么为什么需要 Interlocked.Exchange(ref Object, Object) ? https://stackoverflow.com/questions/2192124/reference-assignment-is-atomic-so-why-is-interlocked-exchangeref-object-object
引用分配是线程安全的吗? https://stackoverflow.com/questions/5209623/is-a-reference-assignment-threadsafe
您始终可以锁定对包本身的访问并创建它的新实例。如果袋子里的物品没有其他东西附着,那么它们将有资格获得 GC:
lock (something)
{
bag = new ConcurrentBag();
}
或者正如卢卡佐德指出的那样:
var newBag = new ConcurrentBag();
Interlocked.Exchange<ConcurrentBag>(ref bag, newBag);
然而,将内容装箱的简单方法是假设每当一个项目想要访问它时它也会获得锁定 - 这可能会很昂贵,并且可能会否定已经进入的性能调整ConcurrentBag
itself.
如果您知道此时没有其他东西可以进入包,请祈祷它并且不要锁定:-)
本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)