private void UnSubscribeInternal <TEventArgs>(ContractInfo contract, ChannelConnectionEventType eventType, EventHandler <TEventArgs> callback)
            where TEventArgs : EventArgs
        {
            if (callback == null)
            {
                throw new ArgumentNullException("callback");
            }

            switch (eventType)
            {
            case ChannelConnectionEventType.Connected:
                List <EventHandler <ChannelConnectedEventArgs> > connectedListeners;
                if (_channelConnectedEventSubscribers.TryGetValue(contract.Key, out connectedListeners))
                {
                    connectedListeners.Remove(callback as EventHandler <ChannelConnectedEventArgs>);
                }
                break;

            case ChannelConnectionEventType.Reconnected:
                List <EventHandler <ChannelConnectedEventArgs> > reconnectedListeners;
                if (_channelReconnectedEventSubscribers.TryGetValue(contract.Key, out reconnectedListeners))
                {
                    reconnectedListeners.Remove(callback as EventHandler <ChannelConnectedEventArgs>);
                }
                break;

            case ChannelConnectionEventType.Disconnected:
                List <EventHandler <ChannelDisconnectedEventArgs> > disconnectedListeners;
                if (_channelDisconnectedEventSubscribers.TryGetValue(contract.Key, out disconnectedListeners))
                {
                    disconnectedListeners.Remove(callback as EventHandler <ChannelDisconnectedEventArgs>);
                }
                break;

            case ChannelConnectionEventType.ExceptionRaised:
                List <EventHandler <ChannelExceptionRaisedEventArgs> > exceptionRaisedListeners;
                if (_channelExceptionRaisedEventSubscribers.TryGetValue(contract.Key, out exceptionRaisedListeners))
                {
                    exceptionRaisedListeners.Remove(callback as EventHandler <ChannelExceptionRaisedEventArgs>);
                }
                break;
            }
        }
 /// <summary>
 /// 取消订阅通道连接状态事件
 /// </summary>
 /// <typeparam name="TContract">需要订阅的服务契约</typeparam>
 /// <typeparam name="TEventArgs">订阅通道状态参数类型</typeparam>
 /// <param name="eventType">通道状态类型</param>
 /// <param name="callback">通道状态变化回调函数</param>
 public void Unsubscribe <TContract, TEventArgs>(ChannelConnectionEventType eventType, EventHandler <TEventArgs> callback)
     where TContract : class
     where TEventArgs : EventArgs
 {
     UnSubscribeInternal <TEventArgs>(new ContractInfo(typeof(TContract)), eventType, callback);
 }