public void Clear() { lockSlim.EnterWriteLock(); var oldFirst = _first; //var oldRear = _rear; _first = null; _rear = null; count = 0; lockSlim.ExitWriteLock(); ThreadPool.QueueUserWorkItem((o) => { var tempNode = (LinkNodeEx <T>)o; LinkNodeEx <T> t1 = null; while (tempNode != null) { t1 = tempNode; tempNode = tempNode.Next; t1.Release(); } }, oldFirst); notifyChanged(NotifyCollectionChangedAction.Reset, null); }
private void removeNode(LinkNodeEx <T> node, bool isRelease = true) { if (_first == null || node.Link != this) { return; } if (node.Previous == null && node.Next == null) { _first = null; _rear = null; } else if (node.Previous == null) //如果需要移除的是首项值 { _first.Next.Previous = null; _first = node.Next; } else if (node.Next == null) { _rear.Previous.Next = null; _rear = node.Previous; } else { node.Previous.Next = node.Next; node.Next.Previous = node.Previous; } if (isRelease) { node.Release(); } Interlocked.Decrement(ref count); notifyChanged(NotifyCollectionChangedAction.Remove, node); if (node is IRecyclable) { node.Dispose(); } }