public void ShouldAlwaysHalt() { var waitStrategy = new AsyncWaitStrategy(); var sequencer = new SingleProducerSequencer(8, waitStrategy); var barrier = new AsyncSequenceBarrier(sequencer, waitStrategy, new Sequence(-1), new Sequence[0]); var dp = new ArrayDataProvider <object>(sequencer.BufferSize); var h1 = new LifeCycleHandler(); var p1 = CreateEventProcessor(dp, barrier, h1); p1.Halt(); p1.Start(); Assert.IsTrue(h1.WaitStart(TimeSpan.FromSeconds(2))); Assert.IsTrue(h1.WaitShutdown(TimeSpan.FromSeconds(2))); for (int i = 0; i < 1000; i++) { var h2 = new LifeCycleHandler(); var p2 = CreateEventProcessor(dp, barrier, h2); p2.Start(); p2.Halt(); Assert.IsTrue(h2.WaitStart(TimeSpan.FromSeconds(2))); Assert.IsTrue(h2.WaitShutdown(TimeSpan.FromSeconds(2))); } for (int i = 0; i < 1000; i++) { var h2 = new LifeCycleHandler(); var p2 = CreateEventProcessor(dp, barrier, h2); p2.Start(); Thread.Yield(); p2.Halt(); Assert.IsTrue(h2.WaitStart(TimeSpan.FromSeconds(2))); Assert.IsTrue(h2.WaitShutdown(TimeSpan.FromSeconds(2))); } }
private static IAsyncEventProcessor <T> CreateEventProcessor <T>(IDataProvider <T> dataProvider, AsyncSequenceBarrier sequenceBarrier, IAsyncBatchEventHandler <T> eventHandler) where T : class { return(EventProcessorFactory.Create(dataProvider, sequenceBarrier, eventHandler)); }
public AsyncBatchEventProcessorTests() { _ringBuffer = new RingBuffer <StubEvent>(() => new StubEvent(-1), new MultiProducerSequencer(16, new AsyncWaitStrategy())); _sequenceBarrier = _ringBuffer.NewAsyncBarrier(); }
/// <summary> /// Create a new <see cref="IEventProcessor{T}"/> with dedicated generic arguments. /// </summary> /// <typeparam name="T">the type of event used.</typeparam> /// <param name="dataProvider">dataProvider to which events are published</param> /// <param name="sequenceBarrier">SequenceBarrier on which it is waiting.</param> /// <param name="eventHandler">eventHandler is the delegate to which events are dispatched.</param> /// <returns></returns> public static IAsyncEventProcessor <T> Create <T>(IDataProvider <T> dataProvider, AsyncSequenceBarrier sequenceBarrier, IAsyncBatchEventHandler <T> eventHandler) where T : class { var dataProviderProxy = StructProxy.CreateProxyInstance(dataProvider); var sequencerOptions = sequenceBarrier.GetSequencerOptions(); var eventHandlerProxy = StructProxy.CreateProxyInstance(eventHandler); var eventProcessorType = typeof(AsyncBatchEventProcessor <, , ,>).MakeGenericType(typeof(T), dataProviderProxy.GetType(), sequencerOptions.GetType(), eventHandlerProxy.GetType()); return((IAsyncEventProcessor <T>)Activator.CreateInstance(eventProcessorType, dataProviderProxy, sequenceBarrier, eventHandlerProxy) !); }