Skip to content

Commit d198e18

Browse files
committed
发送锁代码优化。
1 parent fcd7ded commit d198e18

File tree

1 file changed

+16
-14
lines changed

1 file changed

+16
-14
lines changed

Quick.Protocol/QpChannel.cs

Lines changed: 16 additions & 14 deletions
Original file line numberDiff line numberDiff line change
@@ -51,9 +51,8 @@ public abstract class QpChannel
5151
private readonly ICryptoTransform dec;
5252
private readonly Encoding encoding = Encoding.UTF8;
5353

54-
private Task sendPackageTask = Task.CompletedTask;
5554
//发送包锁对象
56-
private readonly object SEND_PACKAGE_LOCK_OBJ = new object();
55+
private readonly SemaphoreSlim sendLock = new SemaphoreSlim(1, 1);
5756
//断开连接锁对象
5857
private readonly object DISCONNECT_LOCK_OBJ = new object();
5958

@@ -375,20 +374,23 @@ private static void writePackageTotalLengthToBuffer(byte[] buffer, int offset, i
375374
Array.Copy(ret, 0, buffer, offset, sizeof(int));
376375
}
377376

378-
private Task writePackageAsync(Func<PipeWriter,Task<Tuple<QpPackageType, int>>> getPackagePayloadFunc, Action afterSendHandler)
377+
378+
379+
private async Task writePackageAsync(Func<PipeWriter,Task<Tuple<QpPackageType, int>>> getPackagePayloadFunc, Action afterSendHandler)
379380
{
380-
Interlocked.Increment(ref PackageSendQueueCount);
381-
lock (SEND_PACKAGE_LOCK_OBJ)
381+
try
382382
{
383-
_ = sendPackageTask = sendPackageTask.ContinueWith(t =>
384-
{
385-
var stream = QpPackageHandler_Stream;
386-
if (stream == null)
387-
throw new IOException("Connection is disconnected.");
388-
writePackage(getPackagePayloadFunc, afterSendHandler).Wait();
389-
});
390-
_ = sendPackageTask.ContinueWith(t => Interlocked.Decrement(ref PackageSendQueueCount));
391-
return sendPackageTask;
383+
Interlocked.Increment(ref PackageSendQueueCount);
384+
await sendLock.WaitAsync().ConfigureAwait(false);
385+
var stream = QpPackageHandler_Stream;
386+
if (stream == null)
387+
throw new IOException("Connection is disconnected.");
388+
await writePackage(getPackagePayloadFunc, afterSendHandler).ConfigureAwait(false);
389+
}
390+
finally
391+
{
392+
sendLock.Release();
393+
Interlocked.Decrement(ref PackageSendQueueCount);
392394
}
393395
}
394396

0 commit comments

Comments
 (0)