private void OnSequenceChanged(object sender, SequenceChangedEventArgs args)
 {
     if (!this.Equals(args.ExcludedNode))
     {
         Next = args.NewNodeReference;
     }
 }
Пример #2
0
 public RealtimeQueue(Action AddAction)
 {
     base.RootQueue     = this;
     linkNode           = new RealtimeQueueNode(this);
     linkNode.Next      = linkNode;
     addActionMultiplex = new ActionMultiplex(AddAction);
 }
Пример #3
0
 public RealtimeQueue(Action AddAction) : base(null)
 {
     base.rootList      = this;
     LinkNode           = new RealtimeQueueNode <T>(this);
     LinkNode.Next      = LinkNode;
     AddActionMultiplex = new ActionMultiplex(AddAction);
 }
Пример #4
0
 public void Reset()
 {
     if (CurrentNode != null)
     {
         CurrentNode.EnumeratorRelease();
     }
     CurrentNode = rootList.LinkNode;
     CurrentNode.EnumeratorHold();
     TimeoutClock.Reset();
     TimeoutClock.Start();
 }
Пример #5
0
        private RealtimeQueueNode GetNode(T Item = default(T))
        {
            RealtimeQueueNode node;

            nodePool.TryTake(out node);
            if (node == null)
            {
                node = new RealtimeQueueNode(this);
            }
            node.Item = Item;
            return(node);
        }
Пример #6
0
        private RealtimeQueueNode <T> GenerateNode(T Item = default(T))
        {
            RealtimeQueueNode <T> NewNode;

            if (NodeRecycleBin.Count > 0)
            {
                NewNode = NodeRecycleBin.Pop();
            }
            else
            {
                NewNode = new RealtimeQueueNode <T>(this);
            }

            NewNode.Item = Item;

            return(NewNode);
        }
Пример #7
0
        private bool TryMove(Predicate <T> Predicate = null, bool Remove = false)
        {
            lock (rootList.mutex)
            {
                var StartNode = CurrentNode;

                //CurrentNode.Next should never be null
                while (!CurrentNode.Next.Equals(rootList.LinkNode))
                {
                    CurrentNode = CurrentNode.Next;
                    if (Predicate?.Invoke(CurrentNode.Item) ?? true)
                    {
                        StartNode.EnumeratorRelease();
                        CurrentNode.EnumeratorHold();
                        if (Remove)
                        {
                            CurrentNode.Remove();
                        }
                        return(true);
                    }
                }
            }
            return(false);
        }
 internal void NotifySequenceChanged(RealtimeQueueNode NewReference, RealtimeQueueNode ExcludedNode = null)
 {
     lock (rootList.sync)
         SequenceChanged?.Invoke(this, new SequenceChangedEventArgs(NewReference, ExcludedNode));
 }
 public SequenceChangedEventArgs(RealtimeQueueNode <T> NewReference, RealtimeQueueNode <T> ExcludedNode)
 {
     NewNodeReference  = NewReference;
     this.ExcludedNode = ExcludedNode;
 }