【发布时间】:2017-06-14 17:31:13
【问题描述】:
我正在考虑使用 ConcurrentBag,但我不想在我的收藏中允许重复。我的想法是,由于检查和添加到集合之间的“步骤”,这样做不会是线程安全的:
private ConcurrentBag<IClientCallback> _callbackChannels = new ConcurrentBag<IClientCallback>();
...
public void AddCallback(IClientCallback callback) {
if (!_callbackChannels.Contains(callback))
{
_callbackChannels.Add(callback);
}
}
所以我在想这样的事情,但也许这是一个糟糕的想法?
_callbackChannels = new ConcurrentBag<IClientCallback>(_callbackChannels.Union(new List<IClientCallback>() { callback }));
所以,我的问题是:这会比检查添加方法更安全吗?有什么我遗漏的,有没有更好的方法?
我们的想法是,理论上 AddCallback 可能会使用相同的回调通道对象进行多次调用 - 我知道这本身很糟糕,但我还是想处理它。
【问题讨论】:
-
只需使用
ConcurrentDictionary<IClientCallback, object>。 -
@gakera 你考虑过使用 ConcurrentDictionary 吗?
-
ConcurrentDictionary是要走的路。 -
@Fabio 嗯,我没想到那样用它,那可能会更好,谢谢
-
具体来说,使用
ConcurrentDictionary<IClientCallback, byte>,因为与使用对象作为值相比,这也会减少分配。
标签: c# multithreading concurrency