From 641dbf5a52639d9405aeb72e6bdd0c947afd9a29 Mon Sep 17 00:00:00 2001 From: Simon G Date: Sun, 20 Sep 2020 23:45:47 +0200 Subject: [PATCH] #25: implement IAsyncDisposable, call DataHandler.Init() --- GBase/DataHandling/Pool/DataHandlerPool.cs | 29 ++++++++++++++----- .../DataHandling/Pool/IDataHandlerPool.cs | 6 ++-- 2 files changed, 26 insertions(+), 9 deletions(-) diff --git a/GBase/DataHandling/Pool/DataHandlerPool.cs b/GBase/DataHandling/Pool/DataHandlerPool.cs index 23add72..5013e04 100644 --- a/GBase/DataHandling/Pool/DataHandlerPool.cs +++ b/GBase/DataHandling/Pool/DataHandlerPool.cs @@ -4,6 +4,7 @@ using System.Collections.Generic; using System.Linq; +using System.Threading; using System.Threading.Tasks; using GBase.DataHandling.Factories; using GBase.DataHandling.Factories.Pool; @@ -36,17 +37,17 @@ namespace GBase.DataHandling.Pool _waitingRequesters = new List(); } - public async Task RequestDataHandler(object requester) //TODO: async? + public async Task RequestDataHandler(object requester, bool overwrite, CancellationToken cancellationToken) { if (_pool.All(i => i.InUse) && _pool.Count == _availableDataHandlers) //no free dataHandlers available - return await WaitForDataHandler(requester); + return await WaitForDataHandler(requester, cancellationToken); else if (_pool.All(i => i.InUse)) //every existing dataHandler is used -> create a new one - return CreateDataHandler(); + return await CreateDataHandler(overwrite, cancellationToken); else //there are unused dataHandlers existing return GetDataHandler(); } - private async Task WaitForDataHandler(object requester) //TODO: Add request to list/stack (FIFO) with all requests that have to be resolved + private async Task WaitForDataHandler(object requester, CancellationToken cancellationToken) { IDataHandler dataHandler = null; IPoolRequest request = _poolRequestFactory.Create(requester); @@ -58,10 +59,10 @@ namespace GBase.DataHandling.Pool if (_pool.Any(i => !i.InUse)) dataHandler = GetDataHandler(); else - await Task.Delay(1000); + await Task.Delay(1000, cancellationToken); } else if (_waitingRequesters.Contains(request)) //request is in list but not first - await Task.Delay(1000); + await Task.Delay(1000, cancellationToken); else _waitingRequesters.Add(request); } @@ -71,9 +72,10 @@ namespace GBase.DataHandling.Pool return dataHandler; } - private IDataHandler CreateDataHandler() + private async Task CreateDataHandler(bool overwrite, CancellationToken cancellationToken) { IPoolItem item = _poolItemFactory.Create(_dataHandlerFactory.Create()); + await item.Item.Init(overwrite, cancellationToken); _pool.Add(item); item.InUse = true; @@ -87,5 +89,18 @@ namespace GBase.DataHandling.Pool item.InUse = true; return item.Item; } + + public async ValueTask DisposeAsync() + { + while (_waitingRequesters.Any()) + { + await Task.Delay(1000); + } + + foreach (var dataHandler in _pool.Select(i => i.Item)) + { + await dataHandler.DisposeAsync(); + } + } } } \ No newline at end of file diff --git a/GBase/Interfaces/DataHandling/Pool/IDataHandlerPool.cs b/GBase/Interfaces/DataHandling/Pool/IDataHandlerPool.cs index 5410861..ccece22 100644 --- a/GBase/Interfaces/DataHandling/Pool/IDataHandlerPool.cs +++ b/GBase/Interfaces/DataHandling/Pool/IDataHandlerPool.cs @@ -2,12 +2,14 @@ // Created: 2020-09-18 // Copyright(c) 2020 SimonG. All Rights Reserved. +using System; +using System.Threading; using System.Threading.Tasks; namespace GBase.Interfaces.DataHandling.Pool { - public interface IDataHandlerPool + public interface IDataHandlerPool : IAsyncDisposable { - Task RequestDataHandler(object requester); + Task RequestDataHandler(object requester, bool overwrite, CancellationToken cancellationToken); } } \ No newline at end of file