线程安全性是否会阻止ConcurrentBag中的重复?

时间:2018-08-20 09:24:14

标签: c# multithreading

我有以下代码:

public static ConcurrentBag<MyClass> all = new ConcurrentBag<MyClass>();

public static void Load()
{
    all.Add("first");
    all.Add("second");
    all.Add("third");
    all.Add("fourth");

    foreach (MyClass item in all)
    {
        item.Load();
    }
}

是否可以保证我的收藏中有一次“第一个”项目(需要)?
我可以这样迭代吗,还是需要使用Parallel.ForEach?

2 个答案:

答案 0 :(得分:1)

不能保证元素是唯一的:

“当订购无关紧要时,袋子可用于存储对象,与套子不同,袋子支持重复。”

https://docs.microsoft.com/en-us/dotnet/api/system.collections.concurrent.concurrentbag-1?redirectedfrom=MSDN&view=netframework-4.7.2#definition

答案 1 :(得分:0)

根据您的评论,您想要一个单例集合,并且您似乎希望在第一次调用时加载它,我使用Lazy创建了一个解决方案。除了ConcurrentBag,您还可以使用ImmutableList

using System;
using System.Collections.Concurrent;

public class MyClass
{
    public MyClass(string description)
    {
    }

    public void Load()
    {
    }
}

public class MyClassLoader
{
    public static Lazy<ConcurrentBag<MyClass>> allLazy = new Lazy<ConcurrentBag<MyClass>>(() =>
    {
        ConcurrentBag<MyClass> bag = new ConcurrentBag<MyClass>();
        bag.Add(new MyClass("first"));
        bag.Add(new MyClass("second"));
        bag.Add(new MyClass("third"));
        bag.Add(new MyClass("fourth"));
        foreach (MyClass item in bag)
        {
            item.Load();
        }

        return bag;
    }

    );
    public static void Load()
    {
        foreach (MyClass item in allLazy.Value)
        {
        // Do whatever you want
        }
    }
}