async Task WriteAsync()

in src/Net/TransportWriter.cs [107:180]


        async Task WriteAsync()
        {
            const int maxBatchSize = 128 * 1024;

            List<ByteBuffer> buffers = new List<ByteBuffer>();
            while (true)
            {
                ByteBuffer buffer = null;
                int size = 0;

                lock (this.SyncRoot)
                {
                    while (size < maxBatchSize && this.bufferQueue.Count > 0)
                    {
                        ByteBuffer item = this.bufferQueue.Dequeue();
                        if (item.Length == 0)   // special buffer
                        {
                            buffer = item;
                            break;
                        }
                        else
                        {
                            buffers.Add(item);
                            size += item.Length;
                        }
                    }

                    if (size == 0 && buffer == null)
                    {
                        this.writing = false;
                        if (buffer == null)
                        {
                            break;
                        }
                    }
                }

                try
                {
                    if (size > 0)
                    {
                        await this.transport.SendAsync(buffers, size).ConfigureAwait(false);
                    }
                }
                catch (Exception exception)
                {
                    lock (this.SyncRoot)
                    {
                        this.closed = true;
                        this.writing = false;
                        this.transport.Close();
                        buffers.AddRange(this.bufferQueue);
                        this.bufferQueue.Clear();
                    }

                    this.onException(exception);

                    break;
                }
                finally
                {
                    for (int i = 0; i < buffers.Count; i++)
                    {
                        buffers[i].ReleaseReference();
                    }

                    buffers.Clear();
                    if (buffer != null)
                    {
                        buffer.ReleaseReference();
                    }
                }
            }
        }