using System;
using System.Collections.Generic;
using System.Diagnostics;
using System.Linq;
using System.Text;
using System.Threading.Tasks;
namespace FLY.OBJComponents.Server
{
///
/// 周期保存数据,写入到数据库的周期为20s;
/// 但数据的周期最小为1s
///
public class PeriodicallySaveData
{
Stopwatch stopwatch_interval = new Stopwatch();
Stopwatch stopwatch_1min = new Stopwatch();
List dbWidths_1min = new List();
///
/// 数据保存周期,单位s
///
public int IntervalSec = 5;
///
/// 把缓存区的数据一次性导出
///
public Action> SaveList;
///
/// 创造一次数据
///
public Func CreateData;
public void Init(int intervalSec, Action> saveList, Func createData)
{
IntervalSec = intervalSec;
SaveList = saveList;
CreateData = createData;
FObjBase.PollModule.Current.Poll_Config(
FObjBase.PollModule.POLL_CONFIG.ADD, OnPoll, TimeSpan.FromSeconds(1));
}
void OnPoll()
{
if (stopwatch_1min.IsRunning && stopwatch_1min.Elapsed >= TimeSpan.FromSeconds(20))
{
//启动了1min 且到点了
if (dbWidths_1min.Count > 0)
{
SaveList(dbWidths_1min);
dbWidths_1min.Clear();
stopwatch_1min.Restart();
}
else
{
stopwatch_1min.Reset();
}
}
if (!stopwatch_interval.IsRunning)
{
stopwatch_interval.Start();
return;
}
else
{
if (stopwatch_interval.Elapsed < TimeSpan.FromSeconds(IntervalSec))
return;
else
stopwatch_interval.Restart();
}
//记录数据
T db_Width = CreateData();
if (db_Width == null)
{
//没有,退出
return;
}
//写入数据库
if (!stopwatch_1min.IsRunning)
{
//第1次立刻写入
SaveList(new List { db_Width });
stopwatch_1min.Start();
}
else
{
//第2次,1分钟后才能保存
dbWidths_1min.Add(db_Width);
}
}
}
}