private void Dispatch() { ListenerChannel channel = _channel; SessionIdleManager idleManager = _idleManager; _channel = null; _idleManager = null; try { if (channel != null) { ChannelHandler handler = new ChannelHandler(_listenerBinder.MessageVersion, channel.Binder, this, idleManager); if (!channel.Binder.HasSession) { _channelDispatcher.Channels.Add(channel.Binder.Channel); } if (channel.Binder is DuplexChannelBinder) { DuplexChannelBinder duplexChannelBinder = channel.Binder as DuplexChannelBinder; duplexChannelBinder.ChannelHandler = handler; duplexChannelBinder.DefaultCloseTimeout = this.DefaultCloseTimeout; if (_timeouts == null) { duplexChannelBinder.DefaultSendTimeout = ServiceDefaults.SendTimeout; } else { duplexChannelBinder.DefaultSendTimeout = _timeouts.SendTimeout; } } ChannelHandler.Register(handler); channel = null; idleManager = null; } } catch (Exception e) { if (Fx.IsFatal(e)) { throw; } this.HandleError(e); } finally { if (channel != null) { channel.Binder.Channel.Abort(); if (idleManager != null) { idleManager.CancelTimer(); } } } }
private void CancelPendingIdleManager() { SessionIdleManager idleManager = _idleManager; if (idleManager != null) { idleManager.CancelTimer(); } }
private void OpenAndEnsurePump() { Exception exception = null; try { _binder.Channel.Open(); } catch (Exception e) { if (Fx.IsFatal(e)) { throw; } exception = e; } if (exception != null) { SessionIdleManager idleManager = _idleManager; if (idleManager != null) { idleManager.CancelTimer(); } bool errorHandled = this.HandleError(exception); if (_incrementedActivityCountInConstructor) { _listener.ChannelDispatcher.Channels.DecrementActivityCount(); } if (!errorHandled) { _binder.Channel.Abort(); } } else { this.EnsurePump(); } }