@@ -378,7 +378,8 @@ public class WebSocket : IWebSocket
378378 private CancellationTokenSource m_TokenSource ;
379379 private CancellationToken m_CancellationToken ;
380380
381- private readonly object Lock = new object ( ) ;
381+ private readonly object OutgoingMessageLock = new object ( ) ;
382+ private readonly object IncomingMessageLock = new object ( ) ;
382383
383384 private bool isSending = false ;
384385 private List < ArraySegment < byte > > sendBytesQueue = new List < ArraySegment < byte > > ( ) ;
@@ -540,7 +541,7 @@ private async Task SendMessage(List<ArraySegment<byte>> queue, WebSocketMessageT
540541 // The state of the connection is contained in the context Items dictionary.
541542 bool sending ;
542543
543- lock ( Lock )
544+ lock ( OutgoingMessageLock )
544545 {
545546 sending = isSending ;
546547
@@ -573,7 +574,7 @@ private async Task SendMessage(List<ArraySegment<byte>> queue, WebSocketMessageT
573574 }
574575
575576 // Note that we've finished sending.
576- lock ( Lock )
577+ lock ( OutgoingMessageLock )
577578 {
578579 isSending = false ;
579580 }
@@ -584,7 +585,7 @@ private async Task SendMessage(List<ArraySegment<byte>> queue, WebSocketMessageT
584585 else
585586 {
586587 // Add the message to the queue.
587- lock ( Lock )
588+ lock ( OutgoingMessageLock )
588589 {
589590 queue . Add ( buffer ) ;
590591 }
@@ -594,7 +595,7 @@ private async Task SendMessage(List<ArraySegment<byte>> queue, WebSocketMessageT
594595 private async Task HandleQueue ( List < ArraySegment < byte > > queue , WebSocketMessageType messageType )
595596 {
596597 var buffer = new ArraySegment < byte > ( ) ;
597- lock ( Lock )
598+ lock ( OutgoingMessageLock )
598599 {
599600 // Check for an item in the queue.
600601 if ( queue . Count > 0 )
@@ -612,23 +613,28 @@ private async Task HandleQueue(List<ArraySegment<byte>> queue, WebSocketMessageT
612613 }
613614 }
614615
615- private Mutex m_MessageListMutex = new Mutex ( ) ;
616616 private List < byte [ ] > m_MessageList = new List < byte [ ] > ( ) ;
617617
618618 // simple dispatcher for queued messages.
619619 public void DispatchMessageQueue ( )
620620 {
621- // lock mutex, copy queue content and clear the queue.
622- m_MessageListMutex . WaitOne ( ) ;
623- List < byte [ ] > messageListCopy = new List < byte [ ] > ( ) ;
624- messageListCopy . AddRange ( m_MessageList ) ;
625- m_MessageList . Clear ( ) ;
626- // release mutex to allow the websocket to add new messages
627- m_MessageListMutex . ReleaseMutex ( ) ;
628-
629- foreach ( byte [ ] bytes in messageListCopy )
621+ if ( m_MessageList . Count == 0 )
630622 {
631- OnMessage ? . Invoke ( bytes ) ;
623+ return ;
624+ }
625+
626+ List < byte [ ] > messageListCopy ;
627+
628+ lock ( IncomingMessageLock )
629+ {
630+ messageListCopy = new List < byte [ ] > ( m_MessageList ) ;
631+ m_MessageList . Clear ( ) ;
632+ }
633+
634+ var len = messageListCopy . Count ;
635+ for ( int i = 0 ; i < len ; i ++ )
636+ {
637+ OnMessage ? . Invoke ( messageListCopy [ i ] ) ;
632638 }
633639 }
634640
@@ -657,9 +663,10 @@ public async Task Receive()
657663
658664 if ( result . MessageType == WebSocketMessageType . Text )
659665 {
660- m_MessageListMutex . WaitOne ( ) ;
661- m_MessageList . Add ( ms . ToArray ( ) ) ;
662- m_MessageListMutex . ReleaseMutex ( ) ;
666+ lock ( IncomingMessageLock )
667+ {
668+ m_MessageList . Add ( ms . ToArray ( ) ) ;
669+ }
663670
664671 //using (var reader = new StreamReader(ms, Encoding.UTF8))
665672 //{
@@ -669,9 +676,10 @@ public async Task Receive()
669676 }
670677 else if ( result . MessageType == WebSocketMessageType . Binary )
671678 {
672- m_MessageListMutex . WaitOne ( ) ;
673- m_MessageList . Add ( ms . ToArray ( ) ) ;
674- m_MessageListMutex . ReleaseMutex ( ) ;
679+ lock ( IncomingMessageLock )
680+ {
681+ m_MessageList . Add ( ms . ToArray ( ) ) ;
682+ }
675683 }
676684 else if ( result . MessageType == WebSocketMessageType . Close )
677685 {
0 commit comments