diff --git a/src/Websocket.Client/WebsocketClient.cs b/src/Websocket.Client/WebsocketClient.cs index caccd8e..c6b2368 100644 --- a/src/Websocket.Client/WebsocketClient.cs +++ b/src/Websocket.Client/WebsocketClient.cs @@ -22,8 +22,12 @@ public partial class WebsocketClient : IWebsocketClient private readonly ILogger _logger; private readonly WebsocketAsyncLock _locker = new WebsocketAsyncLock(); private readonly Func> _connectionFactory; - private static readonly RecyclableMemoryStreamManager _memoryStreamManager = new RecyclableMemoryStreamManager(); + private readonly RecyclableMemoryStreamManager? _memoryStreamManager; + private static readonly Lazy _globalMemoryStreamManager = new Lazy(new RecyclableMemoryStreamManager()); + private RecyclableMemoryStreamManager MemoryStreamManager => + _memoryStreamManager ?? _globalMemoryStreamManager.Value; + private Uri _url; private Timer? _lastChanceTimer; private DateTime _lastReceivedMsg = DateTime.UtcNow; @@ -47,8 +51,9 @@ public partial class WebsocketClient : IWebsocketClient /// /// Target websocket url (wss://) /// Optional factory for native ClientWebSocket, use it whenever you need some custom features (proxy, settings, etc) - public WebsocketClient(Uri url, Func? clientFactory = null) - : this(url, null, GetClientFactory(clientFactory)) + /// Optional memory stream manager that can be reused on multiple occasions + public WebsocketClient(Uri url, Func? clientFactory = null, RecyclableMemoryStreamManager? memoryStreamManager = null) + : this(url, null, GetClientFactory(clientFactory), memoryStreamManager) { } @@ -58,8 +63,9 @@ public WebsocketClient(Uri url, Func? clientFactory = null) /// Target websocket url (wss://) /// Logger instance, can be null /// Optional factory for native ClientWebSocket, use it whenever you need some custom features (proxy, settings, etc) - public WebsocketClient(Uri url, ILogger? logger, Func? clientFactory = null) - : this(url, logger, GetClientFactory(clientFactory)) + /// Optional memory stream manager that can be reused on multiple occasions + public WebsocketClient(Uri url, ILogger? logger, Func? clientFactory = null, RecyclableMemoryStreamManager? memoryStreamManager = null) + : this(url, logger, GetClientFactory(clientFactory), memoryStreamManager) { } @@ -69,7 +75,8 @@ public WebsocketClient(Uri url, ILogger? logger, FuncTarget websocket url (wss://) /// Logger instance, can be null /// Optional factory for native creating and connecting to a websocket. The method should return a which is connected. Use it whenever you need some custom features (proxy, settings, etc) - public WebsocketClient(Uri url, ILogger? logger, Func>? connectionFactory) + /// Optional memory stream manager that can be reused on multiple occasions + public WebsocketClient(Uri url, ILogger? logger, Func>? connectionFactory, RecyclableMemoryStreamManager? memoryStreamManager = null) { Validations.Validations.ValidateInput(url, nameof(url)); @@ -85,6 +92,7 @@ public WebsocketClient(Uri url, ILogger? logger, Func @@ -458,7 +466,7 @@ private async Task Listen(WebSocket client, CancellationToken token) do { ValueWebSocketReceiveResult result; - var ms = _memoryStreamManager.GetStream(); + var ms = MemoryStreamManager.GetStream(); while (true) {