【问题标题】:Cast SynchronizedCollection<T> to read only SynchronizedReadOnlyCollection<T>将 SynchronizedCollection<T> 强制转换为只读 SynchronizedReadOnlyCollection<T>
【发布时间】:2019-04-18 08:35:57
【问题描述】:

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

怎么做?

【问题讨论】:

    标签: c# multithreading list collections concurrency


    【解决方案1】:

    由于SynchronizedCollection&lt;T&gt; : IEnumerable&lt;T&gt;,您可以使用constructor 基于现有SynchronizedCollection&lt;T&gt; 初始化SynchronizedReadOnlyCollection&lt;T&gt; 的新实例

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

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

    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();
    

    【讨论】:

    • 感谢您的回答!我可以在不创建新对象的情况下做到这一点吗?如果我有一个属性可以只读方式访问该集合,那将非常昂贵。
    【解决方案2】:

    如果您有可枚举类型的数据,那么只需将其传递给同步类构造函数:

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

    【讨论】:

    • 感谢您的回答!我可以在不创建新对象的情况下做到这一点吗?如果我有一个属性可以只读方式访问该集合,那将非常昂贵。
    • 只需将同步集合存储为成员变量即可。
    • 我的意思是new SynchronizedReadOnlyCollection&lt;T&gt;(syncRoot, data);
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2020-05-07
    • 1970-01-01
    • 1970-01-01
    • 2017-07-21
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多