예제 #1
0
        private Task <AsyncTaskResult> DispatchMessages(IEnumerable <IMessage> messages)
        {
            var messageCount = messages.Count();

            if (messageCount == 0)
            {
                return(Task.FromResult <AsyncTaskResult>(AsyncTaskResult.Success));
            }
            var rootDispatching = new RootDisptaching();

            //先对每个事件调用其Handler
            var queueMessageDispatching = new QueueMessageDisptaching(this, rootDispatching, messages);

            DispatchSingleMessage(queueMessageDispatching.DequeueMessage(), queueMessageDispatching);

            //如果有至少两个事件,则尝试调用针对两个事件的Handler
            if (messageCount >= 2)
            {
                var twoMessageHandlers = _twoMessageHandlerProvider.GetHandlers(messages.Select(x => x.GetType()));
                if (twoMessageHandlers.IsNotEmpty())
                {
                    DispatchMultiMessage(messages, twoMessageHandlers, rootDispatching, DispatchTwoMessageToHandlerAsync);
                }
            }
            //如果有至少三个事件,则尝试调用针对三个事件的Handler
            if (messageCount >= 3)
            {
                var threeMessageHandlers = _threeMessageHandlerProvider.GetHandlers(messages.Select(x => x.GetType()));
                if (threeMessageHandlers.IsNotEmpty())
                {
                    DispatchMultiMessage(messages, threeMessageHandlers, rootDispatching, DispatchThreeMessageToHandlerAsync);
                }
            }
            return(rootDispatching.Task);
        }
예제 #2
0
 public QueueMessageDisptaching(DefaultMessageDispatcher dispatcher, RootDisptaching rootDispatching, IEnumerable <IMessage> messages)
 {
     _dispatcher   = dispatcher;
     _messageQueue = new ConcurrentQueue <IMessage>();
     messages.ForEach(message => _messageQueue.Enqueue(message));
     _rootDispatching = rootDispatching;
     _rootDispatching.AddChildDispatching(this);
 }
예제 #3
0
 public MultiMessageDisptaching(IEnumerable <IMessage> messages, IEnumerable <IObjectProxy> handlers, RootDisptaching rootDispatching, ITypeNameProvider typeNameProvider)
 {
     Messages     = messages.ToArray();
     _handlerDict = new ConcurrentDictionary <string, IObjectProxy>();
     handlers.ForEach(x => _handlerDict.TryAdd(typeNameProvider.GetTypeName(x.GetInnerObject().GetType()), x));
     _rootDispatching = rootDispatching;
     _rootDispatching.AddChildDispatching(this);
 }
예제 #4
0
        private void DispatchMultiMessage <T>(IEnumerable <IMessage> messages, IEnumerable <MessageHandlerData <T> > messageHandlerDataList, RootDisptaching rootDispatching, Action <MultiMessageDisptaching, T, QueuedHandler <T>, int> dispatchAction) where T : class, IObjectProxy
        {
            foreach (var messageHandlerData in messageHandlerDataList)
            {
                var multiMessageDispatching = new MultiMessageDisptaching(messages, messageHandlerData.AllHandlers, rootDispatching, _typeNameProvider);

                if (messageHandlerData.ListHandlers != null && messageHandlerData.ListHandlers.IsNotEmpty())
                {
                    foreach (var handler in messageHandlerData.ListHandlers)
                    {
                        dispatchAction(multiMessageDispatching, handler, null, 0);
                    }
                }
                if (messageHandlerData.QueuedHandlers != null && messageHandlerData.QueuedHandlers.IsNotEmpty())
                {
                    var queuedHandler = new QueuedHandler <T>(messageHandlerData.QueuedHandlers,
                                                              (currentQueuedHandler, nextHandler) => dispatchAction(multiMessageDispatching, nextHandler, currentQueuedHandler, 0));
                    dispatchAction(multiMessageDispatching, queuedHandler.DequeueHandler(), queuedHandler, 0);
                }
            }
        }