async Task ReceiveAsync()

in src/Listener/SourceLinkEndpoint.cs [77:118]


        async Task ReceiveAsync()
        {
            while (!this.link.IsDetaching)
            {
                ReceiveContext receiveContext = await this.messageSource.GetMessageAsync(this.link).ConfigureAwait(false);
                if (receiveContext != null)
                {
                    try
                    {
                        uint remaining = this.link.SendMessageInternal(receiveContext.Message, null, receiveContext);
                        if (remaining == 0)
                        {
                            lock (this.syncRoot)
                            {
                                // credits could be received right after the check
                                if (this.link.Credit == 0)
                                {
                                    this.receiving = false;
                                    break;
                                }
                            }
                        }
                    }
                    catch
                    {
                        this.messageSource.DisposeMessage(receiveContext,
                            new DispositionContext(this.link, receiveContext.Message, new Released(), true));
                        break;
                    }
                }
                else if (this.link.IsDraining)
                {
                    lock (this.syncRoot)
                    {
                        this.receiving = false;
                    }

                    this.link.CompleteDrain();
                    break;
                }
            }
        }