Exemple #1
0
 public async Task ReleaseAsync(T stream, AsyncOperationInfo operationInfo)
 {
     using (await _semaphore.AcquireAsync(operationInfo))
     {
         _objects.First(si => object.ReferenceEquals(si.Object, stream)).IsInUse = false;
     }
 }
Exemple #2
0
 public async Task <T> InstantiateWithoutRegistering(AsyncOperationInfo operationInfo)
 {
     using (await _semaphore.AcquireAsync(operationInfo))
     {
         return(await _factory());
     }
 }
Exemple #3
0
        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);
                }
            }
        }