@@ -275,17 +275,6 @@ protected virtual void OnReadError(Exception exception)
275275 Disconnect ( ) ;
276276 }
277277
278- //获取空闲的缓存
279- private static byte [ ] getFreeBuffer ( byte [ ] usingBuffer , params byte [ ] [ ] bufferArray )
280- {
281- foreach ( var buffer in bufferArray )
282- {
283- if ( usingBuffer != buffer )
284- return buffer ;
285- }
286- return null ;
287- }
288-
289278 private async Task writePackageBuffer ( Stream stream , QpPackageType packageType , ReadOnlySequence < byte > packageBodyBuffer , Action afterSendHandler )
290279 {
291280 /*
@@ -366,74 +355,59 @@ await writeTask
366355
367356 private static void writePackageTotalLengthToBuffer ( byte [ ] buffer , int offset , int packageTotalLength )
368357 {
369- //构造包头
370- var ret = BitConverter . GetBytes ( packageTotalLength ) ;
358+ BitConverter . TryWriteBytes ( new Span < byte > ( buffer , offset , sizeof ( int ) ) , packageTotalLength ) ;
371359 //如果是小端字节序,则交换
372360 if ( BitConverter . IsLittleEndian )
373- Array . Reverse ( ret ) ;
374- Array . Copy ( ret , 0 , buffer , offset , sizeof ( int ) ) ;
361+ Array . Reverse ( buffer , offset , sizeof ( int ) ) ;
375362 }
376363
377-
378-
379- private async Task writePackageAsync ( Func < PipeWriter , Task < Tuple < QpPackageType , int > > > getPackagePayloadFunc , Action afterSendHandler )
364+ private async Task writePackageAsync ( Func < PipeWriter , Task < Tuple < QpPackageType , int > > > getPackagePayloadFunc , Action afterSendHandler )
380365 {
381366 try
382367 {
383- Interlocked . Increment ( ref PackageSendQueueCount ) ;
368+ if ( options . EnableNetstat )
369+ Interlocked . Increment ( ref PackageSendQueueCount ) ;
384370 await sendLock . WaitAsync ( ) . ConfigureAwait ( false ) ;
385371 var stream = QpPackageHandler_Stream ;
386372 if ( stream == null )
387373 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 ) ;
394- }
395- }
396374
397- private async Task writePackage ( Func < PipeWriter , Task < Tuple < QpPackageType , int > > > getPackagePayloadFunc , Action afterSendHandler )
398- {
399- var stream = QpPackageHandler_Stream ;
400- if ( stream == null )
401- throw new ArgumentNullException ( nameof ( QpPackageHandler_Stream ) ) ;
402- var ret = await getPackagePayloadFunc ( sendPipe . Writer ) . ConfigureAwait ( false ) ;
403- var packageType = ret . Item1 ;
404- var packageBodyLength = ret . Item2 ;
405- var packageTotalLength = packageBodyLength + PACKAGE_HEAD_LENGTH ;
375+ var ret = await getPackagePayloadFunc ( sendPipe . Writer ) . ConfigureAwait ( false ) ;
376+ var packageType = ret . Item1 ;
377+ var packageBodyLength = ret . Item2 ;
378+ var packageTotalLength = packageBodyLength + PACKAGE_HEAD_LENGTH ;
406379
407- if ( packageTotalLength < PACKAGE_HEAD_LENGTH )
408- throw new IOException ( $ "包大小[{ packageTotalLength } ]小于包头长度[{ PACKAGE_HEAD_LENGTH } ]") ;
409- try
410- {
411- ReadOnlySequence < byte > packageBuffer = default ;
412- if ( packageBodyLength > 0 )
380+ if ( packageTotalLength < PACKAGE_HEAD_LENGTH )
381+ throw new IOException ( $ "包大小[{ packageTotalLength } ]小于包头长度[{ PACKAGE_HEAD_LENGTH } ]") ;
382+ try
413383 {
414- var readRet = await sendPipe . Reader . ReadAtLeastAsync ( packageBodyLength ) . ConfigureAwait ( false ) ;
415- packageBuffer = readRet . Buffer ;
416-
384+ ReadOnlySequence < byte > packageBuffer = default ;
385+ if ( packageBodyLength > 0 )
386+ {
387+ var readRet = await sendPipe . Reader . ReadAtLeastAsync ( packageBodyLength ) . ConfigureAwait ( false ) ;
388+ packageBuffer = readRet . Buffer ;
389+ }
417390 await writePackageBuffer ( stream ,
418391 packageType ,
419392 packageBuffer ,
420393 afterSendHandler ) . ConfigureAwait ( false ) ;
421- sendPipe . Reader . AdvanceTo ( packageBuffer . End ) ;
394+ if ( packageBodyLength > 0 )
395+ {
396+ sendPipe . Reader . AdvanceTo ( packageBuffer . End ) ;
397+ }
398+ lastSendPackageTime = DateTime . Now ;
422399 }
423- else
400+ catch ( Exception ex )
424401 {
425- await writePackageBuffer ( stream ,
426- packageType ,
427- packageBuffer ,
428- afterSendHandler ) . ConfigureAwait ( false ) ;
402+ OnWriteError ( ex ) ;
403+ throw ;
429404 }
430-
431- lastSendPackageTime = DateTime . Now ;
432405 }
433- catch ( Exception ex )
406+ finally
434407 {
435- OnWriteError ( ex ) ;
436- throw ;
408+ sendLock . Release ( ) ;
409+ if ( options . EnableNetstat )
410+ Interlocked . Decrement ( ref PackageSendQueueCount ) ;
437411 }
438412 }
439413
0 commit comments