Example #1
0
        protected override Task <AddressModel> SelectAsync(AddressSelectorContext context)
        {
            var address = context.Address.ToArray();
            var length  = address.Length;

            var index = _generate(0, length);

            return(Task.FromResult(address[index]));
        }
        protected override async Task <AddressModel> SelectAsync(AddressSelectorContext context)
        {
            var key   = GetCacheKey(context.Descriptor);
            var entry = _concurrent.GetOrAdd(key,
                                             k => new Lazy <AddressEntry>(() => new AddressEntry(context.Address))).Value;

            AddressModel address;

            do
            {
                address = entry.GetAddress();
            } while (await _healthCheckService.IsHealth(address) == false);

            return(address);
        }
        /// <summary>
        /// 选择一个地址。
        /// </summary>
        /// <param name="context">地址选择上下文。</param>
        /// <returns>地址模型。</returns>
        ValueTask <AddressModel> IAddressSelector.SelectAsync(AddressSelectorContext context)
        {
            if (context == null)
            {
                throw new ArgumentNullException(nameof(context));
            }
            if (context.Descriptor == null)
            {
                throw new ArgumentNullException(nameof(context.Descriptor));
            }
            if (context.Address == null)
            {
                throw new ArgumentNullException(nameof(context.Address));
            }

            var address = context.Address.ToArray();

            if (!address.Any())
            {
                throw new ArgumentException("没有任何地址信息。", nameof(context.Address));
            }

            return(context.Address.Count() == 1 ? new ValueTask <AddressModel>(context.Address.First()) : new ValueTask <AddressModel>(SelectAsync(context)));
        }
 /// <summary>
 /// 选择一个地址。
 /// </summary>
 /// <param name="context">地址选择上下文。</param>
 /// <returns>地址模型。</returns>
 protected abstract Task <AddressModel> SelectAsync(AddressSelectorContext context);