/// <summary>
        ///
        /// </summary>
        static void BeginOpenAsyncCallback(IAsyncResult ar)
        {
            MessageContainerTransportClient client = (MessageContainerTransportClient)ar.AsyncState;

            try
            {
                IMessageContainerTransport serverInterface;
                lock (client)
                {
                    serverInterface = client._proxyServerInterface;
                }

                if (serverInterface == null)
                {
                    return;
                }

                if (ar.IsCompleted)
                {
                    client._connectionSessionID = serverInterface.ClientRegister();
                    SystemMonitor.Report("Client registered sessionID [" + client.ConnectionSessionID + "]");

                    //// Release this as early as possible, since it might be needed before the event is raised.
                    //client._connectingEvent.Set();
                }

                ((IChannel)serverInterface).EndOpen(ar);
            }
            catch (Exception ex)
            {
                TracerHelper.Trace("Failed to create proxy interface [" + ex.Message + "]");
            }
            finally
            {// This will get executed even if the return statement is hit.
                client._connectingEvent.Set();
            }

            if (client.ConnectionStatusChangedEvent != null)
            {
                GeneralHelper.FireAndForget(delegate() { client.ConnectionStatusChangedEvent(true); });
            }
        }
        public override bool ArbiterInitialize(Arbiter arbiter)
        {
            bool result = base.ArbiterInitialize(arbiter);

            lock (this)
            {
                if (_transportClient != null)
                {
                    throw new Exception("Already initialized.");
                }

                _transportClient = new MessageContainerTransportClient();
                _transportClient.ConnectionStatusChangedEvent += new MessageContainerTransportClient.ConnectionStatusChangedDelegate(_transportClient_ConnectionStatusChangedEvent);
                _transportClient.MessageContainerReceivedEvent += new HandlerDelegate<MessageContainer>(_transport_MessageReceivedEvent);
            }

            _transportClient.Initialize(_serverAddressUri);

            return result;
        }
        /// <summary>
        /// Helper.
        /// </summary>
        static void CreateClientProxyInterface(MessageContainerTransportClient client)
        {
            TracerHelper.TraceEntry();

            if (client._proxyServerInterface != null &&
                client._connectingEvent.WaitOne(client._defaultConnectionTimeOut) == false)
            {
                SystemMonitor.OperationError("Timed out, since another creation is in progress.");
                return;
            }

            SystemMonitor.CheckOperationWarning(string.IsNullOrEmpty(client._connectionSessionID), "Session seems to be active.");

            client._connectingEvent.Reset();

            try
            {
                IMessageContainerTransport serverInterface;
                DuplexChannelFactory <IMessageContainerTransport> channelFactory = null;

                lock (client)
                {
                    if (client._proxyServerInterface != null)
                    {
                        ((IChannel)client._proxyServerInterface).Opened  -= new EventHandler(client.MessageContainerTransportClient_Opened);
                        ((IChannel)client._proxyServerInterface).Opening -= new EventHandler(client.MessageContainerTransportClient_Opening);
                        ((IChannel)client._proxyServerInterface).Faulted -= new EventHandler(client.MessageContainerTransportClient_Faulted);
                        ((IChannel)client._proxyServerInterface).Closing -= new EventHandler(client.MessageContainerTransportClient_Closing);
                    }

                    client._connectionSessionID = string.Empty;
                    if (client._channelFactory == null)
                    {
                        return;
                    }

                    channelFactory = client._channelFactory;
                }

                serverInterface = channelFactory.CreateChannel();

                ((IChannel)serverInterface).Opened  += new EventHandler(client.MessageContainerTransportClient_Opened);
                ((IChannel)serverInterface).Opening += new EventHandler(client.MessageContainerTransportClient_Opening);
                ((IChannel)serverInterface).Faulted += new EventHandler(client.MessageContainerTransportClient_Faulted);
                ((IChannel)serverInterface).Closing += new EventHandler(client.MessageContainerTransportClient_Closing);

                lock (client)
                {
                    client._proxyServerInterface = serverInterface;
                }

                ((IChannel)serverInterface).BeginOpen(TimeSpan.FromSeconds(10), BeginOpenAsyncCallback, client);

                //client._connectionSessionID = serverInterface.ClientRegister();
                //SystemMonitor.Report("Client registered sessionID [" + client.ConnectionSessionID + "]");

                //// Release this as early as possible, since it might be needed before the event is raised.
                //client._connectingEvent.Set();

                //if (client.ConnectionStatusChangedEvent != null)
                //{
                //    GeneralHelper.FireAndForget(delegate() { client.ConnectionStatusChangedEvent(true); });
                //}
            }
            catch (Exception ex)
            {
                TracerHelper.Trace("Failed to create proxy interface [" + ex.Message + "]");
            }
            finally
            {// Always make sure to leave the baseMethod with a released event.
             //client._connectingEvent.Set();
            }
        }
        /// <summary>
        /// Helper.
        /// </summary>
        static void CreateClientProxyInterface(MessageContainerTransportClient client)
        {
            TracerHelper.TraceEntry();

            if (client._proxyServerInterface != null &&
                client._connectingEvent.WaitOne(client._defaultConnectionTimeOut) == false)
            {
                SystemMonitor.OperationError("Timed out, since another creation is in progress.");
                return;
            }

            SystemMonitor.CheckOperationWarning(string.IsNullOrEmpty(client._connectionSessionID), "Session seems to be active.");

            client._connectingEvent.Reset();

            try
            {
                IMessageContainerTransport serverInterface;
                DuplexChannelFactory<IMessageContainerTransport> channelFactory = null;

                lock (client)
                {
                    if (client._proxyServerInterface != null)
                    {
                        ((IChannel)client._proxyServerInterface).Opened -= new EventHandler(client.MessageContainerTransportClient_Opened);
                        ((IChannel)client._proxyServerInterface).Opening -= new EventHandler(client.MessageContainerTransportClient_Opening);
                        ((IChannel)client._proxyServerInterface).Faulted -= new EventHandler(client.MessageContainerTransportClient_Faulted);
                        ((IChannel)client._proxyServerInterface).Closing -= new EventHandler(client.MessageContainerTransportClient_Closing);
                    }

                    client._connectionSessionID = string.Empty;
                    if (client._channelFactory == null)
                    {
                        return;
                    }

                    channelFactory = client._channelFactory;
                }

                serverInterface = channelFactory.CreateChannel();

                ((IChannel)serverInterface).Opened += new EventHandler(client.MessageContainerTransportClient_Opened);
                ((IChannel)serverInterface).Opening += new EventHandler(client.MessageContainerTransportClient_Opening);
                ((IChannel)serverInterface).Faulted += new EventHandler(client.MessageContainerTransportClient_Faulted);
                ((IChannel)serverInterface).Closing += new EventHandler(client.MessageContainerTransportClient_Closing);

                lock(client)
                {
                    client._proxyServerInterface = serverInterface;
                }

                ((IChannel)serverInterface).BeginOpen(TimeSpan.FromSeconds(10), BeginOpenAsyncCallback, client);

                //client._connectionSessionID = serverInterface.ClientRegister();
                //SystemMonitor.Report("Client registered sessionID [" + client.ConnectionSessionID + "]");

                //// Release this as early as possible, since it might be needed before the event is raised.
                //client._connectingEvent.Set();

                //if (client.ConnectionStatusChangedEvent != null)
                //{
                //    GeneralHelper.FireAndForget(delegate() { client.ConnectionStatusChangedEvent(true); });
                //}
            }
            catch (Exception ex)
            {
                TracerHelper.Trace("Failed to create proxy interface [" + ex.Message + "]");
            }
            finally
            {// Always make sure to leave the baseMethod with a released event.
                //client._connectingEvent.Set();
            }
        }
        public override bool ArbiterUnInitialize()
        {
            bool result = base.ArbiterUnInitialize();
            lock (this)
            {
                if (_transportClient != null)
                {
                    _transportClient.UnInitialize();
                    _transportClient = null;
                }
            }

            return result;
        }