gpt4 book ai didi

C# 对 List 的并行读取访问而无需复制

转载 作者:太空狗 更新时间:2023-10-29 20:19:46 25 4
gpt4 key购买 nike

考虑以下示例:

class Example
{
private readonly List<string> _list = new List<string>();
private readonly object _lock = new object();

public IReadOnlyList<string> Contents
{
get
{
lock (_lock)
{
return new List<string>(_list);
}
}
}

public void ModifyOperation(string example)
{
lock (_lock)
{
// ...
_list.Add(example);
// ...
}
}
}

如何在不复制整个列表的情况下实现对 Contents 列表的并行读取访问?在 C# 中有并发 Collections ,但是没有线程安全的List。在 Java 中有类似于 CopyOnWriteArrayList 的东西。 .

最佳答案

在我看来 ImmutableList<T> 来自 System.Collections.Immutable 的类(class)包非常适合这种情况。它实现了 IReadOnlyList<T> ,并且由于它是不可变的,即从未修改过,您可以直接从读取访问器返回它。唯一需要的同步是在修改操作之间:

class Example
{
private ImmutableList<string> _list = ImmutableList<string>.Empty;
private readonly object _lock = new object();

public IReadOnlyList<string> Contents => _list;

public void ModifyOperation(string example)
{
lock (_lock)
{
// ...
_list = _list.Add(example);
// ...
}
}
}

关于C# 对 List 的并行读取访问而无需复制,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/38848335/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com