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)); }
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(); } }); }
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(); } })); }