将SynchronizedCollection <t>强制转换为只读SynchronizedReadOnlyCollection <t>

时间:2019-04-18 08:35:58

标签: c# multithreading list collections concurrency

我有一个List<T>,使用了AsReadOnly()方法,并将结果存储在ReadOnlyCollection<T>中。现在,我在线程中工作,需要执行相同的操作,但是使用SynchronizedCollection<T>代替List<T>,而使用SynchronizedReadOnlyCollection<T>代替ReadOnlyCollection<T>

该怎么做?

2 个答案:

答案 0 :(得分:1)

如果您具有可枚举类型的数据,则只需将其传递到同步的类构造函数中即可:

List<T> data = new List<T>();

var syncRoot = new object();
var syncCollection = new SynchronizedCollection<T>(syncRoot, data);

var synchronizedReadOnlyCollection = new SynchronizedReadOnlyCollection<T>(syncRoot, data);

答案 1 :(得分:1)

SynchronizedCollection<T> : IEnumerable<T>起,您可以使用constructor根据现有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();
相关问题