线程安全列表.删除创建的 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);
}
}
}
您锁定的是项目而不是_lock对象
public bool Remove(TValue item)
{
lock (item) // this should be _lock
{
return _storage.Remove(item);
}
}