Skip to content

Commit 409b060

Browse files
committed
Defer lambda creation in WritePayloadAsync.
1 parent 0d36dfb commit 409b060

File tree

1 file changed

+11
-7
lines changed

1 file changed

+11
-7
lines changed

src/MySqlConnector/Protocol/Serialization/ProtocolUtility.cs

Lines changed: 11 additions & 7 deletions
Original file line numberDiff line numberDiff line change
@@ -116,16 +116,20 @@ private static bool HasReadPayload(ref ArraySegment<byte> previousPayloads, Pack
116116

117117
public static ValueTask<int> WritePayloadAsync(IByteHandler byteHandler, Func<int> getNextSequenceNumber, ArraySegment<byte> payload, IOBehavior ioBehavior)
118118
{
119-
if (payload.Count <= MaxPacketSize)
120-
return WritePacketAsync(byteHandler, getNextSequenceNumber(), payload, ioBehavior);
119+
return payload.Count <= MaxPacketSize ? WritePacketAsync(byteHandler, getNextSequenceNumber(), payload, ioBehavior) :
120+
CreateTask(byteHandler, getNextSequenceNumber, payload, ioBehavior);
121121

122-
var writeTask = default(ValueTask<int>);
123-
for (var bytesSent = 0; bytesSent < payload.Count; bytesSent += MaxPacketSize)
122+
// NOTE: use a local function (with no captures) to defer creation of lambda objects
123+
ValueTask<int> CreateTask(IByteHandler byteHandler_, Func<int> getNextSequenceNumber_, ArraySegment<byte> payload_, IOBehavior ioBehavior_)
124124
{
125-
var contents = new ArraySegment<byte>(payload.Array, payload.Offset + bytesSent, Math.Min(MaxPacketSize, payload.Count - bytesSent));
126-
writeTask = writeTask.ContinueWith(x => WritePacketAsync(byteHandler, getNextSequenceNumber(), contents, ioBehavior));
125+
var writeTask = default(ValueTask<int>);
126+
for (var bytesSent = 0; bytesSent < payload_.Count; bytesSent += MaxPacketSize)
127+
{
128+
var contents = new ArraySegment<byte>(payload_.Array, payload_.Offset + bytesSent, Math.Min(MaxPacketSize, payload_.Count - bytesSent));
129+
writeTask = writeTask.ContinueWith(x => WritePacketAsync(byteHandler_, getNextSequenceNumber_(), contents, ioBehavior_));
130+
}
131+
return writeTask;
127132
}
128-
return writeTask;
129133
}
130134

131135
public static ValueTask<int> WritePacketAsync(IByteHandler byteHandler, int sequenceNumber, ArraySegment<byte> contents, IOBehavior ioBehavior)

0 commit comments

Comments
 (0)