wanshenmean
2026-03-09 2df3b287a5c868f987b99ff00dc1d2339747b8f1
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
using System.Collections.Concurrent;
 
namespace WIDESEA_Core.Core
{
    /// <summary>
    /// 轮询服务 - 线程安全的地址轮询选择
    /// </summary>
    public class RoundRobinService
    {
        /// <summary>
        /// 轮询计数器 - key: 巷道前缀, value: 当前索引
        /// </summary>
        private readonly ConcurrentDictionary<string, int> _counters = new();
 
        /// <summary>
        /// 获取下一个地址(轮询)
        /// </summary>
        /// <param name="key">巷道前缀标识</param>
        /// <param name="addresses">候选地址列表</param>
        /// <returns>选中的目标地址</returns>
        public string GetNextAddress(string key, List<string> 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];
        }
    }
}