示例#1
0
        public IDisposable StartServer()
        {
            _contexts.Subscribe(ctx => Task.Run(async() =>
            {
                monitor.OnMessageStart();
                await SendResponse(ctx, _buffer);
                monitor.OnMessageEnd();
                monitor.OnMessage();
            }));

            monitor.Start();
            return(Disposable.Create(_contexts.Dispose));
        }
示例#2
0
        public IDisposable Start()
        {
            ConnectionRateMonitor monitor = new ConnectionRateMonitor();
            var connections = new Task[_connections];
            for (int i = 0; i < _connections; i++)
            {
                var channel = _factory.CreateChannel(_address);
                var openTask = Task.Factory.FromAsync(channel.BeginOpen, channel.EndOpen, null);
                openTask.ContinueWith(_ => monitor.OnConnect());
                _channels.Enqueue(channel);
                connections[i] = openTask;
            }

            Task.WaitAll(connections);

            double backlog = 0;
            double currentRate = 0;
            AsyncCallback cb = (iar) =>
                        {
                            IDuplexSessionChannel channel = (IDuplexSessionChannel)iar.AsyncState;
                            backlog = monitor.OnMessageEnd();
                            monitor.OnMessage();
                            channel.EndSend(iar);
                        };

            var load = Observable.Interval(TimeSpan.FromMilliseconds(1000))
                .TakeWhile(_ => !_isDisposed)
                .Where(_ => backlog <= _rate)
                .Subscribe(async _ =>
                {
                    int pending = _rate;

                    Action action = () =>
                    {
                        //Console.WriteLine("Thread ID" + System.Threading.Thread.CurrentThread.ManagedThreadId);
                        while (Interlocked.Decrement(ref pending) >= 0)
                        {
                            var channel = GetNextChannel();
                            monitor.OnMessageStart();
                            var iar = channel.BeginSend(_messageBuffer.CreateMessage(), cb, channel);
                        }
                    };

                    Parallel.Invoke(
                        new ParallelOptions()
                                    {
                                        MaxDegreeOfParallelism = Environment.ProcessorCount * 4,
                                    },
                                    action, action, action, action,
                                    action, action, action, action
                                    );
                },
                    ex => Console.WriteLine(ex.Message + " \n" + ex.StackTrace));

            var ratemonitor = monitor.Start();

            return Disposable.Create(() =>
            {
                // Terminate the timer as well.
                _isDisposed = true;
                load.Dispose();
                ratemonitor.Dispose();

                lock (ThisLock)
                {
                    while (_channels.Count > 0)
                    {
                        var c = _channels.Dequeue();
                        c.Abort();
                    }

                    _factory.Abort();
                }
            });
        }
示例#3
0
        public IDisposable Start()
        {
            ConnectionRateMonitor monitor = new ConnectionRateMonitor();
            var connections = new Task[_connections];

            for (int i = 0; i < _connections; i++)
            {
                var channel  = _factory.CreateChannel(_address);
                var openTask = Task.Factory.FromAsync(channel.BeginOpen, channel.EndOpen, null);
                openTask.ContinueWith(_ => monitor.OnConnect());
                _channels.Enqueue(channel);
                connections[i] = openTask;
            }

            Task.WaitAll(connections);

            double        backlog     = 0;
            double        currentRate = 0;
            AsyncCallback cb          = (iar) =>
            {
                IDuplexSessionChannel channel = (IDuplexSessionChannel)iar.AsyncState;
                backlog = monitor.OnMessageEnd();
                monitor.OnMessage();
                channel.EndSend(iar);
            };

            var load = Observable.Interval(TimeSpan.FromMilliseconds(1000))
                       .TakeWhile(_ => !_isDisposed)
                       .Where(_ => backlog <= _rate)
                       .Subscribe(async _ =>
            {
                int pending = _rate;

                Action action = () =>
                {
                    //Console.WriteLine("Thread ID" + System.Threading.Thread.CurrentThread.ManagedThreadId);
                    while (Interlocked.Decrement(ref pending) >= 0)
                    {
                        var channel = GetNextChannel();
                        monitor.OnMessageStart();
                        var iar = channel.BeginSend(_messageBuffer.CreateMessage(), cb, channel);
                    }
                };

                Parallel.Invoke(
                    new ParallelOptions()
                {
                    MaxDegreeOfParallelism = Environment.ProcessorCount * 4,
                },
                    action, action, action, action,
                    action, action, action, action
                    );
            },
                                  ex => Console.WriteLine(ex.Message + " \n" + ex.StackTrace));

            var ratemonitor = monitor.Start();

            return(Disposable.Create(() =>
            {
                // Terminate the timer as well.
                _isDisposed = true;
                load.Dispose();
                ratemonitor.Dispose();

                lock (ThisLock)
                {
                    while (_channels.Count > 0)
                    {
                        var c = _channels.Dequeue();
                        c.Abort();
                    }

                    _factory.Abort();
                }
            }));
        }