|  | @@ -33,7 +33,7 @@ namespace MediaBrowser.Controller.Net
 | 
	
		
			
				|  |  |              SingleWriter = false
 | 
	
		
			
				|  |  |          });
 | 
	
		
			
				|  |  |  
 | 
	
		
			
				|  |  | -        private readonly SemaphoreSlim _lock = new(1, 1);
 | 
	
		
			
				|  |  | +        private readonly object _activeConnectionsLock = new();
 | 
	
		
			
				|  |  |  
 | 
	
		
			
				|  |  |          /// <summary>
 | 
	
		
			
				|  |  |          /// The _active connections.
 | 
	
	
		
			
				|  | @@ -126,15 +126,10 @@ namespace MediaBrowser.Controller.Net
 | 
	
		
			
				|  |  |                  InitialDelayMs = dueTimeMs
 | 
	
		
			
				|  |  |              };
 | 
	
		
			
				|  |  |  
 | 
	
		
			
				|  |  | -            _lock.Wait();
 | 
	
		
			
				|  |  | -            try
 | 
	
		
			
				|  |  | +            lock (_activeConnectionsLock)
 | 
	
		
			
				|  |  |              {
 | 
	
		
			
				|  |  |                  _activeConnections.Add((message.Connection, cancellationTokenSource, state));
 | 
	
		
			
				|  |  |              }
 | 
	
		
			
				|  |  | -            finally
 | 
	
		
			
				|  |  | -            {
 | 
	
		
			
				|  |  | -                _lock.Release();
 | 
	
		
			
				|  |  | -            }
 | 
	
		
			
				|  |  |          }
 | 
	
		
			
				|  |  |  
 | 
	
		
			
				|  |  |          protected void SendData(bool force)
 | 
	
	
		
			
				|  | @@ -153,8 +148,7 @@ namespace MediaBrowser.Controller.Net
 | 
	
		
			
				|  |  |                          (IWebSocketConnection Connection, CancellationTokenSource CancellationTokenSource, TStateType State)[] tuples;
 | 
	
		
			
				|  |  |  
 | 
	
		
			
				|  |  |                          var now = DateTime.UtcNow;
 | 
	
		
			
				|  |  | -                        await _lock.WaitAsync().ConfigureAwait(false);
 | 
	
		
			
				|  |  | -                        try
 | 
	
		
			
				|  |  | +                        lock (_activeConnectionsLock)
 | 
	
		
			
				|  |  |                          {
 | 
	
		
			
				|  |  |                              if (_activeConnections.Count == 0)
 | 
	
		
			
				|  |  |                              {
 | 
	
	
		
			
				|  | @@ -174,10 +168,6 @@ namespace MediaBrowser.Controller.Net
 | 
	
		
			
				|  |  |                                  })
 | 
	
		
			
				|  |  |                                  .ToArray();
 | 
	
		
			
				|  |  |                          }
 | 
	
		
			
				|  |  | -                        finally
 | 
	
		
			
				|  |  | -                        {
 | 
	
		
			
				|  |  | -                            _lock.Release();
 | 
	
		
			
				|  |  | -                        }
 | 
	
		
			
				|  |  |  
 | 
	
		
			
				|  |  |                          if (tuples.Length == 0)
 | 
	
		
			
				|  |  |                          {
 | 
	
	
		
			
				|  | @@ -240,8 +230,7 @@ namespace MediaBrowser.Controller.Net
 | 
	
		
			
				|  |  |          /// <param name="message">The message.</param>
 | 
	
		
			
				|  |  |          private void Stop(WebSocketMessageInfo message)
 | 
	
		
			
				|  |  |          {
 | 
	
		
			
				|  |  | -            _lock.Wait();
 | 
	
		
			
				|  |  | -            try
 | 
	
		
			
				|  |  | +            lock (_activeConnectionsLock)
 | 
	
		
			
				|  |  |              {
 | 
	
		
			
				|  |  |                  var connection = _activeConnections.FirstOrDefault(c => c.Connection == message.Connection);
 | 
	
		
			
				|  |  |  
 | 
	
	
		
			
				|  | @@ -250,10 +239,6 @@ namespace MediaBrowser.Controller.Net
 | 
	
		
			
				|  |  |                      DisposeConnection(connection);
 | 
	
		
			
				|  |  |                  }
 | 
	
		
			
				|  |  |              }
 | 
	
		
			
				|  |  | -            finally
 | 
	
		
			
				|  |  | -            {
 | 
	
		
			
				|  |  | -                _lock.Release();
 | 
	
		
			
				|  |  | -            }
 | 
	
		
			
				|  |  |          }
 | 
	
		
			
				|  |  |  
 | 
	
		
			
				|  |  |          /// <summary>
 | 
	
	
		
			
				|  | @@ -283,15 +268,10 @@ namespace MediaBrowser.Controller.Net
 | 
	
		
			
				|  |  |                  Logger.LogError(ex, "Error disposing websocket");
 | 
	
		
			
				|  |  |              }
 | 
	
		
			
				|  |  |  
 | 
	
		
			
				|  |  | -            _lock.Wait();
 | 
	
		
			
				|  |  | -            try
 | 
	
		
			
				|  |  | +            lock (_activeConnectionsLock)
 | 
	
		
			
				|  |  |              {
 | 
	
		
			
				|  |  |                  _activeConnections.Remove(connection);
 | 
	
		
			
				|  |  |              }
 | 
	
		
			
				|  |  | -            finally
 | 
	
		
			
				|  |  | -            {
 | 
	
		
			
				|  |  | -                _lock.Release();
 | 
	
		
			
				|  |  | -            }
 | 
	
		
			
				|  |  |          }
 | 
	
		
			
				|  |  |  
 | 
	
		
			
				|  |  |          protected virtual async ValueTask DisposeAsyncCore()
 | 
	
	
		
			
				|  | @@ -306,18 +286,13 @@ namespace MediaBrowser.Controller.Net
 | 
	
		
			
				|  |  |                  Logger.LogError(ex, "Disposing the message consumer failed");
 | 
	
		
			
				|  |  |              }
 | 
	
		
			
				|  |  |  
 | 
	
		
			
				|  |  | -            await _lock.WaitAsync().ConfigureAwait(false);
 | 
	
		
			
				|  |  | -            try
 | 
	
		
			
				|  |  | +            lock (_activeConnectionsLock)
 | 
	
		
			
				|  |  |              {
 | 
	
		
			
				|  |  |                  foreach (var connection in _activeConnections.ToArray())
 | 
	
		
			
				|  |  |                  {
 | 
	
		
			
				|  |  |                      DisposeConnection(connection);
 | 
	
		
			
				|  |  |                  }
 | 
	
		
			
				|  |  |              }
 | 
	
		
			
				|  |  | -            finally
 | 
	
		
			
				|  |  | -            {
 | 
	
		
			
				|  |  | -                _lock.Release();
 | 
	
		
			
				|  |  | -            }
 | 
	
		
			
				|  |  |          }
 | 
	
		
			
				|  |  |  
 | 
	
		
			
				|  |  |          /// <inheritdoc />
 |