线程安全列表.删除创建的 System.ArgumentOutOfRangeException

本文关键字:创建 System ArgumentOutOfRangeException 删除 安全 列表 线程 | 更新日期: 2023-09-27 17:56:15

我正在使用安全ConcurentList<int>来管理许多线程。但是现在我得到了 System.ArgumentOutOfRangeException 在方法 Remove() 中时,列表项中可用时被删除。

msdn 中有关 List.Remove 方法 (T) https://msdn.microsoft.com/en-us//library/cd666k3e(v=vs.110).aspx 的帮助不包含任何异常。

public class ConcurrentList<TValue> 
{
    private object _lock = new object();
    private List<TValue> _storage = new List<TValue>();
    public TValue this[int index]
    {
        get
        {
            lock (_lock)
            {
                return _storage[index];
            }
        }
        set
        {
            lock (_lock)
            {
                _storage[index] = value;
            }
        }
    }

    public int Count
    {
        get
        {
            lock (_lock)
            {
                return _storage.Count;
            }
        }
    }
    public void Add(TValue item)
    {
        lock (_lock)
        {
            _storage.Add(item);
        }
    }
    public void Clear()
    {
        lock (_lock)
        {
            _storage.Clear();
        }
    }
    public TValue[] ToArray()
    {
        lock (_lock)
        {
            return  _storage.ToArray();
        }
    }
    /// <summary>
    /// Delete a element by index.
    /// Returns the deleted item or null if list is empty
    /// </summary>
    public object RemoveAt(int index)
    {
        if (index < _storage.Count) // first unlock check
        {
            lock (_lock)
            {
                if (index < _storage.Count) // second lock check
                {
                    object element = _storage[index];
                    _storage.RemoveAt(index);
                    return element;
                }
            }
        }
        return null;
    }
    public bool Remove(TValue item)
    {
        lock (item)
        {
            return _storage.Remove(item);
        }
    }
    public bool Contains(TValue item)
    {
        lock (_lock)
        {
            return _storage.Contains(item);
        }
    }
}

线程安全列表<T>.删除创建的 System.ArgumentOutOfRangeException

您锁定的是项目而不是_lock对象

 public bool Remove(TValue item)
 {
    lock (item) // this should be _lock
    {
        return _storage.Remove(item);
    }
 }