@@ -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