/// <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(); } }
public void Test() { var disposes = new CompositeDisposable(); var dis1 = new DisposeObject1(); var dis2 = new DisposeObject2(); Assert.IsFalse(disposes.IsDisposed); Assert.IsFalse(dis1.IsDisposed); Assert.IsFalse(dis2.IsDisposed); disposes.AddDisposable(dis1); disposes.AddDisposable(dis2); disposes.Dispose(); Assert.IsTrue(disposes.IsDisposed); Assert.IsTrue(dis1.IsDisposed); Assert.IsTrue(dis2.IsDisposed); }
public void DisposeTest() { var disposes = new CompositeDisposable(); var dis1 = new DisposeObject1(); disposes.Dispose(); disposes.AddDisposable(new DisposeObject1()); }
/// <summary> /// 订阅消息 /// </summary> /// <param name="bus">消息总线</param> /// <param name="subscriber">订阅者,方法上标记有SubscribeAttribute 标签的</param> /// <returns></returns> public static IDisposable Subscribe(this IMessageBus bus, object subscriber) { Guard.NotNull(bus, "bus"); Guard.NotNull(subscriber, "subscriber"); var key = subscriber.GetType().TypeHandle; IDisposable unsubscribers; lock (subscriberTypes) { if (subscriberTypes.TryGetValue(key, out unsubscribers)) { return(unsubscribers); } var subscribers = AttributeProviderInspector.InspectSubscribeMethods(subscriber.GetType()); if (subscribers == null || subscribers.Length == 0) { subscriberTypes.Add(key, Disposable.Empty); return(Disposable.Empty); } var disposeArray = new CompositeDisposable(); var disCollector = subscriber as IDisposeCollector; var compositeDis = subscriber as ICompositeDisposable; foreach (var item in subscribers) { var unsubscriber = bus.Subscribe(item.Factory(subscriber)); disposeArray.AddDisposable(unsubscriber); if (!item.Method.IsStatic) { if (compositeDis != null) { compositeDis.AddDisposable(unsubscriber); } else if (disCollector != null) { disCollector.Disposes.AddDisposable(unsubscriber); } } } subscriberTypes[key] = disposeArray; return(disposeArray); } }