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);