C# 短信发送记录

 public class CodeSendHistory
{
    static readonly int maxCount = 10;
    readonly System.Collections.Concurrent.ConcurrentDictionary<string, Info> histories = new System.Collections.Concurrent.ConcurrentDictionary<string, Info>();
    readonly static string filePath = System.IO.Path.Combine(AppDomain.CurrentDomain.BaseDirectory, "app_data", $"{nameof(CodeSendHistory)}");
    int sign = 0;

    System.Timers.Timer timerCreate = new System.Timers.Timer() { AutoReset = false };
    System.Timers.Timer timerUpdate = new System.Timers.Timer(60 * 1000);

    CodeSendHistory()
    {
        var fileInfo = new System.IO.FileInfo($"{filePath}_{DateTime.Now.ToString("yyyyMMdd")}");
        if (!fileInfo.Directory.Exists)
        {
            fileInfo.Directory.Create();
        }

        timerCreate.Elapsed += (s, e) =>
        {
            if (timerCreate.Interval <= 1000)
            {
                timerCreate.Interval = (DateTime.Now.AddDays(1).Date - DateTime.Now).TotalMilliseconds + 100;
            }
            else
            {
                timerCreate.Interval = new TimeSpan(24, 0, 0).TotalMilliseconds;
            }
            timerCreate.Start();
            if (fileInfo.Exists)
            {
                histories.Clear();
                Info[] temp = null;
                lock (this)
                {
                    try
                    {
                        temp = System.IO.File.ReadAllText(fileInfo.FullName).XmlTo<Info[]>();
                    }
                    catch (Exception)
                    {
                        temp = new Info[0];
                    }
                }
                foreach (var item in temp)
                {
                    histories[item.Moblie] = item;
                }
            }
        };
        timerCreate.Start();


        timerUpdate.Elapsed += (s, e) =>
        {
            if (histories.Sum(item => item.Value.Count) + histories.Count != sign)
            {
                lock (this)
                {
                    System.IO.File.WriteAllText(fileInfo.FullName, histories.Select(item => item.Value).ToArray().ToXml());
                }
            }
        };
        timerUpdate.Start();
    }

    /// <summary>
    /// 发送后记录
    /// </summary>
    /// <param name="mobile"></param>
    public void Increase(string mobile)
    {
        histories[mobile].Count++;
    }
    /// <summary>
    /// 发送前检查
    /// </summary>
    /// <param name="mobile"></param>
    /// <returns></returns>
    public bool CanSend(string mobile)
    {
        Info info;
        if (histories.TryGetValue(mobile, out info))
        {
            return info.Count <= maxCount;
        }
        else
        {
            histories[mobile] = new Info
            {
                Count = 0,
                LastTime = DateTime.Now,
                Moblie = mobile
            };
            return true;
        }
    }

    static CodeSendHistory instance = new CodeSendHistory();
    public static CodeSendHistory Instance { get { return instance; } }
}

public class Info
{
    public string Moblie { get; set; }
    public int Count { get; set; }
    public DateTime LastTime { get; set; }
}
        /// <summary>
    /// Xml 序列化 
    /// </summary>
    /// <param name="obj">序列化目标对象</param>
    /// <returns>Xml 内容</returns>
    public static string ToXml(this object obj)
    {
        XmlSerializer serializer = new XmlSerializer(obj.GetType());
        using (StringWriter sw = new StringWriter())
        {
            serializer.Serialize(sw, obj);
            return sw.ToString();
        }
    }
            /// <summary>
    /// Xml 反序列化
    /// </summary>    
    /// <typeparam name="T">目标类型</typeparam>
    /// <param name="obj">Xml 内容</param>
    /// <returns>指定T的对象</returns>
    public static T XmlTo<T>(this string xml) where T : class
    {
        XmlSerializer serializer = new XmlSerializer(typeof(T));
        using (StringReader sw = new StringReader(xml))
        {
            return serializer.Deserialize(sw) as T ?? default(T);
        }
    }
  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值