bool SendMessage() { IAsyncResult result = innerChannel.BeginSend(this.message, onInnerSend, this); if (!result.CompletedSynchronously) { return(false); } innerChannel.EndSend(result); return(true); }
public void EndSend(IAsyncResult result) { innerDuplexSessionChannel.EndSend(result); }
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(); } })); }