示例#1
0
        public ManagedEventDispatcher(
            IEnumerable <View> views,
            ISequenceResolver sequenceResolver,
            IRepository <string, SequenceInfo> sequenceRepository,
            Func <long, IOrderedBuffer> bufferFactory,
            int quietTimeTimeout)
        {
            Guard.Against.NullOrEmptyOrNullElements(() => views);

            this.views = views.ToDictionary(
                view => view,
                view =>
            {
                var sequenceInfo = sequenceRepository.Get(view.GetType().FullName);
                return(sequenceInfo == null ? 0L : sequenceInfo.SequenceNumber);
            });

            this.sequenceResolver   = sequenceResolver;
            this.sequenceRepository = sequenceRepository;
            this.quietTimeTimeout   = quietTimeTimeout;

            this.sequenceNumber = this.views.Values.Min();

            this.buffer = bufferFactory.Invoke(this.sequenceNumber);

            var task = new Task(() => this.Run(this.cancellationTokenSource.Token));

            task.ContinueWith(t => this.cancellationTokenSource.Dispose(), TaskContinuationOptions.ExecuteSynchronously);
            task.Start();

            this.timer = new Timer(this.TimerCallback, null, this.quietTimeTimeout, Timeout.Infinite);
        }
示例#2
0
        public OrderedEventDispatcher(IEventDispatcher innerEventDispatcher, ISequenceResolver sequenceResolver, IOrderedBuffer buffer)
        {
            Guard.Against.Null(() => innerEventDispatcher);
            Guard.Against.Null(() => sequenceResolver);
            Guard.Against.Null(() => buffer);

            this.innerEventDispatcher = innerEventDispatcher;
            this.sequenceResolver     = sequenceResolver;
            this.buffer = buffer;

            var task = new Task(() => this.Run(this.cancellationTokenSource.Token));

            task.ContinueWith(t => this.cancellationTokenSource.Dispose(), TaskContinuationOptions.ExecuteSynchronously);
            task.Start();
        }