Disco.Services.Interop.ActiveDirectory.ADDomain.GetAvailableDomainController C# (CSharp) Method

GetAvailableDomainController() public method

public GetAvailableDomainController ( bool RequireWritable = false ) : ADDomainController
RequireWritable bool
return ADDomainController
        public ADDomainController GetAvailableDomainController(bool RequireWritable = false)
        {
            if (this.domainMaintenanceNext < DateTime.Now)
                MaintainDomainControllers();

            IEnumerable<ADDomainController> availableServers;

            // Try Site Servers first
            availableServers = AvailableDomainControllers(RequireSiteServer: true, RequireWritable: RequireWritable);

            if (!availableServers.Any())
            {
                // No Site Servers available - try all
                availableServers = AvailableDomainControllers(RequireSiteServer: false, RequireWritable: RequireWritable);

                if (!availableServers.Any())
                {
                    lock (domainMaintainLock)
                    {
                        availableServers = AvailableDomainControllers(RequireSiteServer: false, RequireWritable: RequireWritable);

                        if (!availableServers.Any())
                            return DiscoverAvailableDomainController(RequireWritable);
                    }
                }
            }

            switch (availableServers.Count())
            {
                case 1:
                    // 1 Available DC
                    return availableServers.First();
                default:
                    // Multiple DCs Available - Round Robin
                    int drr = Interlocked.Increment(ref domainControllerRoundRobin);
                    int dcrrValue = drr % availableServers.Count();

                    if (drr > availableServers.Count())
                        domainControllerRoundRobin = -1;

                    return availableServers.ElementAt(dcrrValue);
            }
        }
        private IEnumerable<ADDomainController> AvailableDomainControllers(bool RequireSiteServer, bool RequireWritable)