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);
}
}
C# 短信发送记录
最新推荐文章于 2021-07-14 17:44:01 发布