/// <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); } }