是ConcurrentBag中的Parallel.ForEach <T>线程安全

Vla*_*den 10 concurrency multithreading .net-4.0 thread-safety c#-4.0

MSDN上ConcurrentBag的描述不清楚:

当订购无关紧要时,袋子可用于存放物品,与套装不同,袋子支持重复.ConcurrentBag是一个线程安全的包实现,针对同一个线程将生成和消耗存储在包中的数据的情况进行了优化.

我的问题是它是线程安全的,如果在Parallel.ForEach中使用ConcurrentBag这是一个很好的做法.

例如:

    private List<XYZ> MyMethod(List<MyData> myData)
    {
        var data = new ConcurrentBag<XYZ>();

        Parallel.ForEach(myData, item =>
                        {
                            // Some data manipulation

                            data.Add(new XYZ(/* constructor parameters */);
                        });

        return data.ToList();
    }
Run Code Online (Sandbox Code Playgroud)

这样我就不必使用常规List在Parallel.ForEach中使用同步锁定.

非常感谢.

Ste*_*ary 8

这看起来很好.您使用它的方式是线程安全的.

如果您可以返回IEnumerable<XYZ>,则可以通过List<T>在完成时不复制到更高效.