zoukankan      html  css  js  c++  java
  • 一个简单的令牌桶

    由于需求变化,今天临时写了一个“令牌桶”类。他的功能是:存放令牌并管理令牌的过期时间

    不多说了直接上代码:

        public class TokenBucket
        {
            /// <summary>
            /// 令牌过期时间
            /// 默认60秒
            /// </summary>
            public int TokenTimeOutTrick { get; set; } = 60000;
            private readonly ConcurrentDictionary<string, CancellationTokenSource> buket = new ConcurrentDictionary<string, CancellationTokenSource>();
            /// <summary>
            /// 添加令牌
            /// </summary>
            /// <param name="token"></param>
            /// <returns></returns>
            public bool AddToken(string token)
            {
                CancellationTokenSource tokenSource = new CancellationTokenSource();
                var result = buket.TryAdd(token, tokenSource);
                if (result)
                {
    #pragma warning disable CS4014 // 由于此调用不会等待,因此在调用完成前将继续执行当前方法
                    TokenTimeOut(token, tokenSource);
    #pragma warning restore CS4014 // 由于此调用不会等待,因此在调用完成前将继续执行当前方法
                }
                return result;
            }
            /// <summary>
            /// 令牌过期
            /// </summary>
            /// <param name="token"></param>
            /// <param name="tokenSource"></param>
            /// <returns></returns>
            private async Task TokenTimeOut(string token, CancellationTokenSource tokenSource)
            {
                CancellationToken cancellationToken = tokenSource.Token;
                await Task.Delay(TokenTimeOutTrick, cancellationToken);
                buket.TryRemove(token, out CancellationTokenSource cts);
                if (cts != null)
                    cts.Dispose();
            }
            /// <summary>
            /// 删除令牌
            /// </summary>
            /// <param name="token"></param>
            public void ReomveToken(string token)
            {
                var remove = buket.TryRemove(token, out CancellationTokenSource cts);
                try
                {
                    if (remove)
                    {
                        cts.Cancel();
                    }
                }
                catch { }
                finally
                {
                    if (cts != null)
                        cts.Dispose();
                }
            }
            /// <summary>
            /// 令牌是否存在
            /// </summary>
            /// <param name="token"></param>
            /// <returns></returns>
            public bool HasToken(string token)
            {
                return buket.ContainsKey(token);
            }
        }
  • 相关阅读:
    SSO 单点登录
    CPU运行原理及对线程的影响01
    表单设计器
    Session 身份验证
    cookie 身份验证及跨域
    WebService 身份验证01_SoapHeader及 iis windows 集成身份验证
    WebService 代理类型
    WebService
    网络协议的理解 http、udp、tcp 等
    Container
  • 原文地址:https://www.cnblogs.com/lws66/p/13509943.html
Copyright © 2011-2022 走看看