我有一个List<T>
,使用了AsReadOnly()
方法,并将结果存储在ReadOnlyCollection<T>
中。现在,我在线程中工作,需要执行相同的操作,但是使用SynchronizedCollection<T>
代替List<T>
,而使用SynchronizedReadOnlyCollection<T>
代替ReadOnlyCollection<T>
该怎么做?
答案 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();