Ejemplo n.º 1
0
        private void OfferMessageToLink(TargetLink link)
        {
            List <ResourceEvent <TResource> > msg;

            lock (_lock)
            {
                if (!_queue.TryPeek(out msg))
                {
                    return;                     // queue is empty
                }
            }

            var header = new DataflowMessageHeader(++_msgId);

            link.LastOfferedMessageReply = link.Target.OfferMessage(header, msg, this, true);
            if (link.LastOfferedMessageReply == DataflowMessageStatus.DecliningPermanently)
            {
                _targets.Remove(link);
            }
        }
Ejemplo n.º 2
0
        public IDisposable LinkTo(ITargetBlock <List <ResourceEvent <TResource> > > target, DataflowLinkOptions linkOptions)
        {
            //todo: add support for max messages
            lock (_lock)
            {
                var link = new TargetLink
                {
                    Target                  = target,
                    LinkOptions             = linkOptions,
                    LastOfferedMessageReply = DataflowMessageStatus.NotAvailable
                };
                if (linkOptions.Append)
                {
                    _targets.Add(link);
                }
                else
                {
                    _targets.Insert(0, link);
                }

                OfferMessageToLink(link);
                return(Disposable.Create(() => _targets.Remove(link)));
            }
        }