public virtual void CanAddMultipleDomainEventsToSingleEventProviderConcurrently() { var accountId = SequentialAtEndGuidGenerator.NewGuid(); var command = new Create(accountId, 100); var domainEvents = AccountAggregateRoot.Create(command); domainEvents.AggregateRoot.State.ExternalStateTracker = GetStateTracker(domainEvents); Repository.Commit(new CommandHandlerContext(command), domainEvents.AggregateRoot as AccountAggregateRoot); var synchronizer = new AggregateRootSynchronizer(new AggregateRootSynchronizationCache()); var aggregateRootCache = new AggregateRootCache(); var ch = new SynchronizedAggregateRootCommandHandler <AccountAggregateRoot, Deposit>(Repository, synchronizer, aggregateRootCache); var ch1 = new SynchronizedAggregateRootCommandHandler <AccountAggregateRoot, Withdraw2>(Repository, synchronizer, aggregateRootCache); var random = new Random(); Parallel.For(0, 20, (i) => { ch.Handle(new CommandHandlerContext(new Deposit(accountId, i))); ch1.Handle(new CommandHandlerContext(new Withdraw2(accountId, random.Next(1, 10) * i))); }); }