/// <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();
            }
        }
Exemple #2
0
        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());
        }
Exemple #4
0
        public void DisposeTest()
        {
            var disposes = new CompositeDisposable();
            var dis1     = new DisposeObject1();

            disposes.Dispose();


            disposes.AddDisposable(new DisposeObject1());
        }
        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);

          


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