private async Task <TResult> DoWithConnectedTcpClientAsync <TResult>( Func <Stream, Task <TResult> > doWithNetworkStream) { TcpClientHolder tcpClientHolder = null; try { tcpClientHolder = await _connectionsPool.Acquire(); return(await doWithNetworkStream(tcpClientHolder.NetworkStream)); } catch (SocketException socketException) { _logger.LogError(socketException); throw new CoreRpcCommunicationException( $"Error dispatching a call to the server: {socketException.Message}"); } finally { if (tcpClientHolder != null) { _connectionsPool.Release(tcpClientHolder); } } }
private async Task CloseTcpClient(TcpClientHolder tcpClientHolder) { if (tcpClientHolder.TcpClient.Connected) { await ExceptionsHandlingHelper.ExecuteWithExceptionLogging( () => SendDataAsync( tcpClientHolder.NetworkStream, NetworkConstants.EndOfSessionMessageBytes), async() => { // ReSharper disable once AccessToDisposedClosure - synchronous code tcpClientHolder.TcpClient.Close(); await tcpClientHolder.NetworkStream.DisposeAsync(); }, _logger); } tcpClientHolder.TcpClient.Dispose(); }