private async void OnNonTerminalDataAvailableEvent(object sender, NonTerminalDataAvailableEventArgs <TData> e)
        {
            var semaphore = await _semaphore.WaitAsync(e.Descriptor);

            try
            {
                await DataPool.SaveAsync(e.Descriptor, e.RetrievalContext, semaphore.Release);
            }
            finally
            {
                semaphore.Release();
            }
        }
        public virtual async Task Acquire(ITerminalDescriptor descriptor)
        {
            var semaphore = await _semaphore.WaitAsync(descriptor);

            try
            {
                if (DataPool.Contains(descriptor) == false)
                {
                    await DataPool.SaveAsync(descriptor, await DataRetriever.RetrieveAsync(descriptor), semaphore.Release);
                }
            }
            finally
            {
                semaphore.Release();
            }
        }
 public virtual void FillCollectionWithData(ICollection <TData> collection, INonTerminalDescriptor descriptor)
 {
     ClearCollection(collection);
     AppendToCollection(DataPool.Retrieve(descriptor), collection);
 }
        public virtual async Task <IEnumerable <TData> > RetrieveAsync(INonTerminalDescriptor descriptor)
        {
            await Acquire(descriptor);

            return(DataPool.Retrieve(descriptor));
        }
        public virtual async Task <TData> RetrieveAsync(ITerminalDescriptor descriptor)
        {
            await Acquire(descriptor);

            return(DataPool.Retrieve(descriptor));
        }