mirror of
https://github.com/dotnet/MQTTnet.git
synced 2026-10-19 02:53:06 +08:00
Optimize package serializing and dispatching.
This commit is contained in:
@@ -139,37 +139,36 @@ namespace MQTTnet.Adapter
|
||||
{
|
||||
ReadingPacketStarted?.Invoke(this, EventArgs.Empty);
|
||||
|
||||
var bodyLength = await MqttPacketReader.ReadBodyLengthAsync(channel, cancellationToken).ConfigureAwait(false);
|
||||
if (bodyLength == 0)
|
||||
if (fixedHeader.RemainingLength == 0)
|
||||
{
|
||||
return new ReceivedMqttPacket(fixedHeader, null);
|
||||
return new ReceivedMqttPacket(fixedHeader.Flags, null);
|
||||
}
|
||||
|
||||
var body = new MemoryStream(bodyLength);
|
||||
var body = new MemoryStream(fixedHeader.RemainingLength);
|
||||
|
||||
var buffer = new byte[Math.Min(ReadBufferSize, bodyLength)];
|
||||
while (body.Length < bodyLength)
|
||||
var buffer = new byte[Math.Min(ReadBufferSize, fixedHeader.RemainingLength)];
|
||||
while (body.Length < fixedHeader.RemainingLength)
|
||||
{
|
||||
var bytesLeft = bodyLength - (int)body.Length;
|
||||
var bytesLeft = fixedHeader.RemainingLength - (int)body.Length;
|
||||
if (bytesLeft > buffer.Length)
|
||||
{
|
||||
bytesLeft = buffer.Length;
|
||||
}
|
||||
|
||||
var readBytesCount = await channel.ReadAsync(buffer, 0, bytesLeft, cancellationToken).ConfigureAwait(false);
|
||||
if (readBytesCount <= 0)
|
||||
var readBytes = await channel.ReadAsync(buffer, 0, bytesLeft, cancellationToken).ConfigureAwait(false);
|
||||
if (readBytes <= 0)
|
||||
{
|
||||
ExceptionHelper.ThrowGracefulSocketClose();
|
||||
}
|
||||
|
||||
// Here is no need to await because internally only an array is used and no real I/O operation is made.
|
||||
// Using async here will only generate overhead.
|
||||
body.Write(buffer, 0, readBytesCount);
|
||||
body.Write(buffer, 0, readBytes);
|
||||
}
|
||||
|
||||
body.Seek(0L, SeekOrigin.Begin);
|
||||
|
||||
return new ReceivedMqttPacket(fixedHeader, body);
|
||||
return new ReceivedMqttPacket(fixedHeader.Flags, body);
|
||||
}
|
||||
finally
|
||||
{
|
||||
|
||||
Reference in New Issue
Block a user