Skip to content

Commit c74f5e0

Browse files
committed
Replace ContinueWith with await.
1 parent d9e2fa1 commit c74f5e0

File tree

2 files changed

+54
-53
lines changed

2 files changed

+54
-53
lines changed

src/MySqlConnector/Core/ServerSession.cs

Lines changed: 35 additions & 32 deletions
Original file line numberDiff line numberDiff line change
@@ -748,7 +748,27 @@ public ValueTask<PayloadData> ReceiveReplyAsync(IOBehavior ioBehavior, Cancellat
748748
return ValueTaskExtensions.FromException<PayloadData>(exception);
749749
}
750750

751-
return new ValueTask<PayloadData>(task.AsTask().ContinueWith(TryAsyncContinuation, cancellationToken, TaskContinuationOptions.LazyCancellation | TaskContinuationOptions.ExecuteSynchronously, TaskScheduler.Default));
751+
return ReceiveReplyAsyncAwaited(task);
752+
}
753+
754+
private async ValueTask<PayloadData> ReceiveReplyAsyncAwaited(ValueTask<ArraySegment<byte>> task)
755+
{
756+
ArraySegment<byte> bytes;
757+
try
758+
{
759+
bytes = await task.ConfigureAwait(false);
760+
}
761+
catch (Exception ex)
762+
{
763+
SetFailed(ex);
764+
if (ex is MySqlException msex && msex.Number == (int) MySqlErrorCode.CommandTimeoutExpired)
765+
HandleTimeout();
766+
throw;
767+
}
768+
var payload = new PayloadData(bytes);
769+
if (payload.HeaderByte == ErrorPayload.Signature)
770+
throw CreateExceptionForErrorPayload(payload.Span);
771+
return payload;
752772
}
753773

754774
// Continues a conversation with the server by sending a reply to a packet received with 'Receive' or 'ReceiveReply'.
@@ -769,7 +789,20 @@ public ValueTask<int> SendReplyAsync(PayloadData payload, IOBehavior ioBehavior,
769789
if (task.IsCompletedSuccessfully)
770790
return task;
771791

772-
return new ValueTask<int>(task.AsTask().ContinueWith(TryAsyncContinuation, cancellationToken, TaskContinuationOptions.LazyCancellation | TaskContinuationOptions.ExecuteSynchronously, TaskScheduler.Default));
792+
return SendReplyAsyncAwaited(task);
793+
}
794+
795+
private async ValueTask<int> SendReplyAsyncAwaited(ValueTask<int> task)
796+
{
797+
try
798+
{
799+
return await task.ConfigureAwait(false);
800+
}
801+
catch (Exception ex)
802+
{
803+
SetFailed(ex);
804+
throw;
805+
}
773806
}
774807

775808
internal void HandleTimeout()
@@ -1373,36 +1406,6 @@ private static void SafeDispose<T>(ref T disposable)
13731406
}
13741407
}
13751408

1376-
private int TryAsyncContinuation(Task<int> task)
1377-
{
1378-
if (task.IsFaulted)
1379-
{
1380-
SetFailed(task.Exception.InnerException);
1381-
task.GetAwaiter().GetResult();
1382-
}
1383-
return 0;
1384-
}
1385-
1386-
private PayloadData TryAsyncContinuation(Task<ArraySegment<byte>> task)
1387-
{
1388-
if (task.IsFaulted)
1389-
SetFailed(task.Exception.InnerException);
1390-
ArraySegment<byte> bytes;
1391-
try
1392-
{
1393-
bytes = task.GetAwaiter().GetResult();
1394-
}
1395-
catch (MySqlException ex) when (ex.Number == (int) MySqlErrorCode.CommandTimeoutExpired)
1396-
{
1397-
HandleTimeout();
1398-
throw;
1399-
}
1400-
var payload = new PayloadData(bytes);
1401-
if (payload.HeaderByte == ErrorPayload.Signature)
1402-
throw CreateExceptionForErrorPayload(payload.Span);
1403-
return payload;
1404-
}
1405-
14061409
internal void SetFailed(Exception exception)
14071410
{
14081411
m_logArguments[1] = exception.Message;

src/MySqlConnector/Protocol/Serialization/ProtocolUtility.cs

Lines changed: 19 additions & 21 deletions
Original file line numberDiff line numberDiff line change
@@ -410,8 +410,8 @@ private static ValueTask<Packet> ReadPacketAsync(BufferedByteReader bufferedByte
410410
return ReadPacketAfterHeader(headerBytesTask.Result, bufferedByteReader, byteHandler, getNextSequenceNumber, protocolErrorBehavior, ioBehavior);
411411
return AddContinuation(headerBytesTask, bufferedByteReader, byteHandler, getNextSequenceNumber, protocolErrorBehavior, ioBehavior);
412412

413-
static ValueTask<Packet> AddContinuation(ValueTask<ArraySegment<byte>> headerBytes_, BufferedByteReader bufferedByteReader_, IByteHandler byteHandler_, Func<int> getNextSequenceNumber_, ProtocolErrorBehavior protocolErrorBehavior_, IOBehavior ioBehavior_) =>
414-
headerBytes_.ContinueWith(x => ReadPacketAfterHeader(x, bufferedByteReader_, byteHandler_, getNextSequenceNumber_, protocolErrorBehavior_, ioBehavior_));
413+
static async ValueTask<Packet> AddContinuation(ValueTask<ArraySegment<byte>> headerBytes_, BufferedByteReader bufferedByteReader_, IByteHandler byteHandler_, Func<int> getNextSequenceNumber_, ProtocolErrorBehavior protocolErrorBehavior_, IOBehavior ioBehavior_) =>
414+
await ReadPacketAfterHeader(await headerBytes_.ConfigureAwait(false), bufferedByteReader_, byteHandler_, getNextSequenceNumber_, protocolErrorBehavior_, ioBehavior_).ConfigureAwait(false);
415415
}
416416

417417
private static ValueTask<Packet> ReadPacketAfterHeader(ArraySegment<byte> headerBytes, BufferedByteReader bufferedByteReader, IByteHandler byteHandler, Func<int> getNextSequenceNumber, ProtocolErrorBehavior protocolErrorBehavior, IOBehavior ioBehavior)
@@ -435,8 +435,8 @@ private static ValueTask<Packet> ReadPacketAfterHeader(ArraySegment<byte> header
435435
return CreatePacketFromPayload(payloadBytesTask.Result, payloadLength, protocolErrorBehavior, packetOutOfOrderException);
436436
return AddContinuation(payloadBytesTask, payloadLength, protocolErrorBehavior, packetOutOfOrderException);
437437

438-
static ValueTask<Packet> AddContinuation(ValueTask<ArraySegment<byte>> payloadBytesTask_, int payloadLength_, ProtocolErrorBehavior protocolErrorBehavior_, Exception packetOutOfOrderException_)
439-
=> payloadBytesTask_.ContinueWith(x => CreatePacketFromPayload(x, payloadLength_, protocolErrorBehavior_, packetOutOfOrderException_));
438+
static async ValueTask<Packet> AddContinuation(ValueTask<ArraySegment<byte>> payloadBytesTask_, int payloadLength_, ProtocolErrorBehavior protocolErrorBehavior_, Exception packetOutOfOrderException_) =>
439+
await CreatePacketFromPayload(await payloadBytesTask_.ConfigureAwait(false), payloadLength_, protocolErrorBehavior_, packetOutOfOrderException_).ConfigureAwait(false);
440440
}
441441

442442
private static ValueTask<Packet> CreatePacketFromPayload(ArraySegment<byte> payloadBytes, int payloadLength, ProtocolErrorBehavior protocolErrorBehavior, Exception exception)
@@ -476,11 +476,12 @@ private static ValueTask<ArraySegment<byte>> DoReadPayloadAsync(BufferedByteRead
476476

477477
return AddContinuation(readPacketTask, bufferedByteReader, byteHandler, getNextSequenceNumber, previousPayloads, protocolErrorBehavior, ioBehavior);
478478

479-
static ValueTask<ArraySegment<byte>> AddContinuation(ValueTask<Packet> readPacketTask_, BufferedByteReader bufferedByteReader_, IByteHandler byteHandler_, Func<int> getNextSequenceNumber_, ArraySegmentHolder<byte> previousPayloads_, ProtocolErrorBehavior protocolErrorBehavior_, IOBehavior ioBehavior_)
479+
static async ValueTask<ArraySegment<byte>> AddContinuation(ValueTask<Packet> readPacketTask_, BufferedByteReader bufferedByteReader_, IByteHandler byteHandler_, Func<int> getNextSequenceNumber_, ArraySegmentHolder<byte> previousPayloads_, ProtocolErrorBehavior protocolErrorBehavior_, IOBehavior ioBehavior_)
480480
{
481-
return readPacketTask_.ContinueWith(packet =>
482-
HasReadPayload(previousPayloads_, packet, protocolErrorBehavior_, out var result_) ? result_ :
483-
DoReadPayloadAsync(bufferedByteReader_, byteHandler_, getNextSequenceNumber_, previousPayloads_, protocolErrorBehavior_, ioBehavior_));
481+
var packet = await readPacketTask_.ConfigureAwait(false);
482+
var resultTask = HasReadPayload(previousPayloads_, packet, protocolErrorBehavior_, out var result_) ? result_ :
483+
DoReadPayloadAsync(bufferedByteReader_, byteHandler_, getNextSequenceNumber_, previousPayloads_, protocolErrorBehavior_, ioBehavior_);
484+
return await resultTask.ConfigureAwait(false);
484485
}
485486
}
486487

@@ -507,24 +508,23 @@ private static bool HasReadPayload(ArraySegmentHolder<byte> previousPayloads, Pa
507508
return true;
508509
}
509510

510-
result = default(ValueTask<ArraySegment<byte>>);
511+
result = default;
511512
return false;
512513
}
513514

514515
public static ValueTask<int> WritePayloadAsync(IByteHandler byteHandler, Func<int> getNextSequenceNumber, ReadOnlyMemory<byte> payload, IOBehavior ioBehavior)
515516
{
516517
return payload.Length <= MaxPacketSize ? WritePacketAsync(byteHandler, getNextSequenceNumber(), payload, ioBehavior) :
517-
CreateTask(byteHandler, getNextSequenceNumber, payload, ioBehavior);
518+
WritePayloadAsyncAwaited(byteHandler, getNextSequenceNumber, payload, ioBehavior);
518519

519-
static ValueTask<int> CreateTask(IByteHandler byteHandler_, Func<int> getNextSequenceNumber_, ReadOnlyMemory<byte> payload_, IOBehavior ioBehavior_)
520+
static async ValueTask<int> WritePayloadAsyncAwaited(IByteHandler byteHandler_, Func<int> getNextSequenceNumber_, ReadOnlyMemory<byte> payload_, IOBehavior ioBehavior_)
520521
{
521-
var writeTask = default(ValueTask<int>);
522522
for (var bytesSent = 0; bytesSent < payload_.Length; bytesSent += MaxPacketSize)
523523
{
524524
var contents = payload_.Slice(bytesSent, Math.Min(MaxPacketSize, payload_.Length - bytesSent));
525-
writeTask = writeTask.ContinueWith(x => WritePacketAsync(byteHandler_, getNextSequenceNumber_(), contents, ioBehavior_));
525+
await WritePacketAsync(byteHandler_, getNextSequenceNumber_(), contents, ioBehavior_).ConfigureAwait(false);
526526
}
527-
return writeTask;
527+
return 0;
528528
}
529529
}
530530

@@ -541,15 +541,13 @@ private static ValueTask<int> WritePacketAsync(IByteHandler byteHandler, int seq
541541
ArrayPool<byte>.Shared.Return(buffer);
542542
return default;
543543
}
544-
return AddContinuation(task, buffer);
544+
return WritePacketAsyncAwaited(task, buffer);
545545

546-
static ValueTask<int> AddContinuation(ValueTask<int> task_, byte[] buffer_)
546+
static async ValueTask<int> WritePacketAsyncAwaited(ValueTask<int> task_, byte[] buffer_)
547547
{
548-
return task_.ContinueWith(x =>
549-
{
550-
ArrayPool<byte>.Shared.Return(buffer_);
551-
return default(ValueTask<int>);
552-
});
548+
await task_.ConfigureAwait(false);
549+
ArrayPool<byte>.Shared.Return(buffer_);
550+
return 0;
553551
}
554552
}
555553

0 commit comments

Comments
 (0)