private IConnectionHandle EndCheckingOut(PooledConnection pooledConnection, Stopwatch stopwatch) { var reference = new ReferenceCounted <PooledConnection>(pooledConnection, _pool.ReleaseConnection); var connectionHandle = new AcquiredConnection(_pool, reference); stopwatch.Stop(); var checkedOutConnectionEvent = new ConnectionPoolCheckedOutConnectionEvent(connectionHandle.ConnectionId, stopwatch.Elapsed, EventContext.OperationId); _pool._checkedOutConnectionEventHandler?.Invoke(checkedOutConnectionEvent); // no need to release the semaphore _poolQueueWaitResult = SemaphoreSlimSignalable.SemaphoreWaitResult.None; return(connectionHandle); }
private AcquiredConnection FinalizePoolEnterance(PooledConnection pooledConnection) { if (pooledConnection != null) { var reference = new ReferenceCounted <PooledConnection>(pooledConnection, _pool.ReleaseConnection); var connectionHandle = new AcquiredConnection(_pool, reference); var checkedOutConnectionEvent = new ConnectionPoolCheckedOutConnectionEvent(connectionHandle.ConnectionId, _stopwatch.Elapsed, EventContext.OperationId); _pool._checkedOutConnectionEventHandler?.Invoke(checkedOutConnectionEvent); return(connectionHandle); } else { _stopwatch.Stop(); var message = $"Timed out waiting for a connection after {_stopwatch.ElapsedMilliseconds}ms."; throw new TimeoutException(message); } }
// methods public async Task <IConnectionHandle> AcquireConnectionAsync(TimeSpan timeout, CancellationToken cancellationToken) { ThrowIfDisposed(); PooledConnection connection; lock (_lock) { connection = ChooseAvailableConnection(); if (connection == null) { connection = CreateConnection(); } } await connection.OpenAsync(timeout, cancellationToken); var acquiredConnection = new AcquiredConnection(connection); var referenceCountedConnection = new ReferenceCountedConnection(acquiredConnection); return(new ConnectionHandle(referenceCountedConnection)); }