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();
}
}
}
}