public async Task ReleaseAsync(T stream, AsyncOperationInfo operationInfo) { using (await _semaphore.AcquireAsync(operationInfo)) { _objects.First(si => object.ReferenceEquals(si.Object, stream)).IsInUse = false; } }
public async Task <T> InstantiateWithoutRegistering(AsyncOperationInfo operationInfo) { using (await _semaphore.AcquireAsync(operationInfo)) { return(await _factory()); } }
public async Task <T> AquireAsync(AsyncOperationInfo operationInfo) { ObjectInfo objectToken = null; do { operationInfo.CancellationToken.ThrowIfCancellationRequested(); objectToken = await tryAquireObjectAsync(); }while (objectToken == null); return(objectToken.Object); ///////////////////////////////////// async Task <ObjectInfo> tryAquireObjectAsync() { using (await _semaphore.AcquireAsync(operationInfo)) { await populateIfAppropriateAsync(); return(tryAcquire()); } ///////////////////////////////////// async Task populateIfAppropriateAsync() { var canInstantiateNew = _maxPoolSize > _objects.Count; var haveSpareObject = _objects.Any(s => !s.IsInUse); if (!haveSpareObject && canInstantiateNew) { _objects.Add(new ObjectInfo() { IsInUse = false, Object = await _factory() }); } } ObjectInfo tryAcquire() { foreach (var objectInfo in _objects) { if (!objectInfo.IsInUse) { objectInfo.IsInUse = true; return(objectInfo); } } return(null); } } }