void CreateChannelNetwork() { _connectionChannel = new ChannelAdapter <ConnectionContext>(); _connectionChannelConnection = _connectionChannel.Connect(x => { var channelProvider = new HttpConnectionChannelProvider(_connectionHandlers); var threadPoolChannel = new ThreadPoolChannel <ConnectionContext>(channelProvider, _concurrentConnectionLimit); x.AddChannel(threadPoolChannel); }); }
void CreateChannelNetwork() { _connectionChannel = new ChannelAdapter<ConnectionContext>(); _connectionChannelConnection = _connectionChannel.Connect(x => { var channelProvider = new HttpConnectionChannelProvider(_connectionHandlers); var threadPoolChannel = new ThreadPoolChannel<ConnectionContext>(channelProvider, _concurrentConnectionLimit); x.AddChannel(threadPoolChannel); }); }
public void Should_not_allow_more_than_the_specified_number_of_consumers() { int count = 0; var exceeded = new Future <int>(); var complete = new Future <bool>(); var locker = new object(); int limit = 20; var provider = new DelegateChannelProvider <TestMessage>(m => { var consumer = new ConsumerChannel <TestMessage>(new SynchronousFiber(), message => { int value = Interlocked.Increment(ref count); Trace.WriteLine("Value: " + value); if (value > limit) { exceeded.Complete(value); } message.Complete(); lock (locker) { while (complete.IsCompleted == false) { Monitor.Wait(locker); } } Interlocked.Decrement(ref count); }); return(consumer); }); Channel <TestMessage> channel = new ThreadPoolChannel <TestMessage>(provider, limit); for (int i = 0; i < limit; i++) { channel.Send(new TestMessage(() => { })); } lock (locker) { while (count < limit) { Monitor.Wait(locker, 100); } } Trace.WriteLine("Sending extra message to try and break it"); ThreadPool.QueueUserWorkItem(x => channel.Send(new TestMessage(() => { lock (locker) { complete.Complete(true); Monitor.PulseAll(locker); } }))); lock (locker) { Trace.WriteLine("Waiting for message to get executed"); bool ready = Monitor.Wait(locker, 5.Seconds()); // it should not, since the queue is full; ready.ShouldBeFalse(); } Trace.WriteLine("Marking complete"); complete.Complete(true); exceeded.IsCompleted.ShouldBeFalse(); }
public void Should_not_allow_more_than_the_specified_number_of_consumers() { int count = 0; var exceeded = new Future<int>(); var complete = new Future<bool>(); var locker = new object(); int limit = 20; var provider = new DelegateChannelProvider<TestMessage>(m => { var consumer = new ConsumerChannel<TestMessage>(new SynchronousFiber(), message => { int value = Interlocked.Increment(ref count); Trace.WriteLine("Value: " + value); if (value > limit) exceeded.Complete(value); message.Complete(); lock (locker) { while (complete.IsCompleted == false) { Monitor.Wait(locker); } } Interlocked.Decrement(ref count); }); return consumer; }); Channel<TestMessage> channel = new ThreadPoolChannel<TestMessage>(provider, limit); for (int i = 0; i < limit; i++) { channel.Send(new TestMessage(() => { })); } lock (locker) { while (count < limit) { Monitor.Wait(locker, 100); } } Trace.WriteLine("Sending extra message to try and break it"); ThreadPool.QueueUserWorkItem(x => channel.Send(new TestMessage(() => { lock (locker) { complete.Complete(true); Monitor.PulseAll(locker); } }))); lock (locker) { Trace.WriteLine("Waiting for message to get executed"); bool ready = Monitor.Wait(locker, 5.Seconds()); // it should not, since the queue is full; ready.ShouldBeFalse(); } Trace.WriteLine("Marking complete"); complete.Complete(true); exceeded.IsCompleted.ShouldBeFalse(); }