/// <summary>
        /// Параллельная обработка перечисления на разных сессиях.
        /// </summary>
        /// <typeparam name="TSrc">Тип данных.</typeparam>
        /// <typeparam name="T">Тип результата.</typeparam>
        /// <param name="src">Перечисление.</param>
        /// <param name="parallelFunc">Функция обоработки.</param>
        /// <returns>Результат.</returns>
        protected async ValueTask <T[]> ParallelizeOnSessions <TSrc, T>(IEnumerable <TSrc> src, Func <IEsentSession, TSrc, T> parallelFunc)
        {
            ValueTask <T> Do(IEsentSession session, TSrc el)
            {
                return(session.Run(() => parallelFunc(session, el)));
            }

            if (src == null)
            {
                throw new ArgumentNullException(nameof(src));
            }
            if (parallelFunc == null)
            {
                throw new ArgumentNullException(nameof(parallelFunc));
            }
            var tasks     = new List <ValueTask <T> >();
            var toDispose = new CompositeDisposable(null);

            try
            {
                foreach (var el in src)
                {
                    var session = await EsentProvider.GetSecondarySessionAndUse();

                    toDispose.AddDisposable(session.usage);
                    tasks.Add(Do(session.session, el));
                }
                return(await CoreTaskHelper.WhenAllValueTasks(tasks));
            }
            finally
            {
                toDispose.Dispose();
            }
        }
        /// <summary>
        /// Запросить данные базы.
        /// </summary>
        /// <typeparam name="T">Тип результата.</typeparam>
        /// <param name="logic">Логика.</param>
        /// <returns>Результат.</returns>
        protected async ValueTask <T> OpenSessionAsync <T>(Func <IEsentSession, ValueTask <T> > logic)
        {
            if (logic == null)
            {
                return(default(T));
            }
            CheckModuleReady();
            var readonlySession = await EsentProvider.GetSecondarySessionAndUse();

            using (readonlySession.usage)
            {
                return(await logic(readonlySession.session));
            }
        }
        /// <summary>
        /// Асинхронно запросить данные базы. Обращения к базе должны производиться из одного потока.
        /// </summary>
        /// <typeparam name="T">Тип результата.</typeparam>
        /// <param name="logic">Логика.</param>
        /// <returns>Результат.</returns>
        protected async ValueTask <T> OpenSession <T>(Func <IEsentSession, T> logic)
        {
            if (logic == null)
            {
                return(default(T));
            }
            CheckModuleReady();
            var readonlySession = await EsentProvider.GetSecondarySessionAndUse();

            using (readonlySession.usage)
            {
                T result = default(T);
                await readonlySession.session.Run(() =>
                {
                    // ReSharper disable once AccessToDisposedClosure
                    result = logic(readonlySession.session);
                });

                return(result);
            }
        }