using System.Collections.Concurrent; namespace WIDESEA_Core.Core { /// /// 轮询服务 - 线程安全的地址轮询选择 /// public class RoundRobinService { /// /// 轮询计数器 - key: 巷道前缀, value: 当前索引 /// private readonly ConcurrentDictionary _counters = new(); /// /// 获取下一个地址(轮询) /// /// 巷道前缀标识 /// 候选地址列表 /// 选中的目标地址 public string GetNextAddress(string key, List addresses) { // 空列表检查 if (addresses == null || addresses.Count == 0) return "10080"; // 单个地址,直接返回 if (addresses.Count == 1) return addresses[0]; // 多个地址,使用轮询选择 // AddOrUpdate 是原子操作,线程安全 int index = _counters.AddOrUpdate( key, 0, // 首次使用,从 0 开始 (k, oldValue) => (oldValue + 1) % addresses.Count // 轮询:递增后取模 ); return addresses[index]; } } }