C#并行读取访问List而不复制

Nic*_*ico 7 .net c# parallel-processing

请考虑以下示例:

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);
            // ...
        }
    }
}
Run Code Online (Sandbox Code Playgroud)

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

Iva*_*oev 6

在我看来ImmutableList<T>,System.Collections.Immutable包中的类非常适合这种情况.它实现IReadOnlyList<T>,因为它是不可变的,即从未修改过,你可以直接从read访问器返回它.所需的唯一同步将在修改操作之间:

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);
            // ...
        }
    }
}
Run Code Online (Sandbox Code Playgroud)