IConcurrentBuffer.cs

74 lines | 2.872 kB Blame History Raw Download
using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;
using System.Threading.Tasks;

using System.Threading;
using System.Collections.Concurrent;
using System.Collections.Specialized;
using System.Collections.ObjectModel;

using Tools.CancellationTokenAsync;

namespace Tools.Collections.Concurrent.AsyncBuffer
{
    public interface IConcurrentBuffer<T>
    {
        /// <summary>
        /// Рекомендуемый максимальный размер.
        /// Само хранилище не контролирует размер
        /// </summary>
        int RecommendedMaxSize { get; }

        /// <summary>
        /// Текущий размер коллекции
        /// </summary>
        int Size { get; }

        //IConcurrentStore<T> Storage { get; }

        /// <summary>
        /// Запрашивает группу данных из хранилища для обработки. n - кол-во данных в хранилище.
        /// Если n = 0, то ожидает поступления данных.
        /// Если n <= maxBatchSize, то возвращает n записей.
        /// Если n > maxBatchSize, то возвращает maxBatchSize записей.
        /// </summary>
        /// <param name="maxBatchSize">Максимальный размер группы</param>
        /// <param name="cancellation">Токен, прерывает ожидание новых данных в случае n = 0</param>
        /// <returns></returns>
        Task<T[]> ConsumeBatchOrWaitAsync(
            int maxBatchSize,
            CancellationToken cancellation = default,
            bool configureAwait = false,
            bool throwOperationCanceledException = false
            );

        /// <summary>
        /// Извлекает один элемент или ожидает, пока он не появиться или до отмены.
        /// </summary>
        Task<T> ConsumeOrWaitAsync(
            CancellationToken cancellation = default,
            bool configureAwait = false,
            bool throwOperationCanceledException = false
            );


        /// <summary>
        /// Принудительно добавить в хранилище.
        /// Не проверяет значение RecommendedMaxSize
        /// </summary>
        /// <param name="dateEntity"></param>
        void AddForce(T dateEntity);

        /// <summary>
        /// Попытка добавить запись в хранилище.
        /// Запись не будет добавлена, если хранилище заполнено (RecommendedMaxSize).
        /// При выполнении хранилище не блокируется и значение Size может превысить RecommendedMaxSize. 
        /// </summary>
        bool TryAdd(T dataEntity);

    }

}