Beispiel #1
0
        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);
        }
Beispiel #2
0
        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();
            }
        }