我有一个List<T>
,使用了AsReadOnly()
方法并将结果存储在ReadOnlyCollection<T>
中。现在我在线程中工作,需要做同样的事情,但用SynchronizedCollection<T>
而不是List<T>
,用SynchronizedReadOnlyCollection<T>
而不是ReadOnlyCollection<T>
怎么做?
自SynchronizedCollection<T> : IEnumerable<T>
以来,您可以使用构造函数根据现有SynchronizedCollection<T>
初始化SynchronizedReadOnlyCollection<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();
如果你的数据是可枚举的类型,那么只需将其传递给同步的类构造函数:
List<T> data = new List<T>();
var syncRoot = new object();
var syncCollection = new SynchronizedCollection<T>(syncRoot, data);
var synchronizedReadOnlyCollection = new SynchronizedReadOnlyCollection<T>(syncRoot, data);