首页 > 解决方案 > 施放 SynchronizedCollection只读 SynchronizedReadOnlyCollection

问题描述

我有一个List<T>, usedAsReadOnly()方法并将结果存储在ReadOnlyCollection<T>. 现在我在线程中工作,需要做同样的事情,但使用SynchronizedCollection<T>而不是List<T>SynchronizedReadOnlyCollection<T>而不是ReadOnlyCollection<T>

怎么做?

标签: c#multithreadinglistcollectionsconcurrency

解决方案


因为您可以使用构造函数根据现有SynchronizedCollection<T> : IEnumerable<T>的初始化SynchronizedReadOnlyCollection<T>SynchronizedCollection<T>

var readOnlyCollection = new SynchronizedReadOnlyCollection(synchronizedCollection.SyncRoot,
                                                            syncronizedCollection);

我也在考虑另一种方法。不同之处在于,使用第一种方法,您确实拥有快照,SynchronizedCollection<T>但使用这种方法,您只有一个只读包装器(如果您向原始集合添加某些内容,它也会更新只读集合)

public static class SynchronizedCollectionExtension
{
    public static IReadOnlyCollection<T> AsReadOnly<T>(this SynchronizedCollection<T> value)
    {
        lock (value.SyncRoot)
        {
            // this call is not expensive as it is just a thin wrapper around the IList<T>
            return new ReadOnlyCollection<T>(value);
        }
    }
}

IReadOnlyCollection<int> readOnlyCollection = collection.AsReadOnly();

推荐阅读