void StartControlService()
        {
            controlServiceHost = null;
            Exception lastException = null;

            for (int iteration = 0; iteration < ListenerConstants.MaxRetries; iteration++)
            {
                controlServiceGuid = Guid.NewGuid();
                string listenerEndPoint = controlServiceGuid.ToString();
                try
                {
                    Type contractType;
                    if (transportType == TransportType.Tcp)
                    {
                        contractType = typeof(TcpWorkerProcess);
                    }
                    else
                    {
                        contractType = typeof(NamedPipeWorkerProcess);
                    }

                    ServiceHost typedServiceHost = new ServiceHost(contractType,
                                                                   Utility.FormatListenerEndpoint(serviceName, listenerEndPoint));
                    typedServiceHost.ServiceThrottle.MaxConcurrentSessions = ListenerConstants.RegistrationMaxConcurrentSessions;
                    typedServiceHost.Description.Behaviors.Remove(typeof(ServiceMetadataBehavior));
                    typedServiceHost.AddServiceEndpoint(typeof(IConnectionRegister),
                                                        CreateRegisterBinding(this.transportType), string.Empty);

                    controlServiceHost = typedServiceHost;
                    controlServiceHost.Open();
                    break;
                }
                catch (CommunicationException exception)
                {
                    if (TD.ServiceStartPipeErrorIsEnabled())
                    {
                        Uri formattedUri = Utility.FormatListenerEndpoint(serviceName, listenerEndPoint);
                        TD.ServiceStartPipeError((formattedUri != null) ? formattedUri.ToString() : string.Empty);
                    }

                    if (DiagnosticUtility.ShouldTraceWarning)
                    {
                        ListenerTraceUtility.TraceEvent(TraceEventType.Warning, ListenerTraceCode.ServiceStartPipeError, SR.GetString(SR.TraceCodeServiceStartPipeError), this, exception);
                    }

                    lastException      = exception;
                    controlServiceHost = null;
                }
            }

            if (controlServiceHost == null)
            {
                throw DiagnosticUtility.ExceptionUtility.ThrowHelperError(
                          new InvalidOperationException(SR.GetString(SR.ServiceStartErrorEndpoint, this.serviceName),
                                                        lastException));
            }
        }