コード例 #1
0
        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);
            });
        }
コード例 #2
0
ファイル: HttpServer.cs プロジェクト: Nangal/Stact
		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);
				});
		}
コード例 #3
0
        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();
        }
コード例 #4
0
        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();
        }