Esempio n. 1
0
                bool SendMessage()
                {
                    IAsyncResult result = innerChannel.BeginSend(this.message, onInnerSend, this);

                    if (!result.CompletedSynchronously)
                    {
                        return(false);
                    }

                    innerChannel.EndSend(result);
                    return(true);
                }
Esempio n. 2
0
 public void EndSend(IAsyncResult result)
 {
     innerDuplexSessionChannel.EndSend(result);
 }
Esempio n. 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();
                }
            }));
        }