internal CoinSnapshotSet(IHostRoot root) { _root = root; Global.Access <Per10SecondEvent>(Guid.Parse( "ab0526fc-01ce-4b8a-942d-d998d0a71a3b"), "周期性拍摄快照", LogEnum.Console, action: message => { DateTime leftTime = message.Timestamp.AddSeconds(-message.Seconds); Snapshot(leftTime, seconds: 10); if (_historyDataSnapshotOver) { DateTime rightTime = leftTime.AddSeconds(10); SnapshotTimestamp.SetSnapshotTimestamp(rightTime); } }); Task.Factory.StartNew(() => { DateTime leftTime = SnapshotTimestamp.GetSnapshotTimestamp(); while (leftTime > DateTime.Now.AddMonths(-1) && leftTime.AddSeconds(10) < DateTime.Now) { Snapshot(leftTime, seconds: 10); DateTime rightTime = leftTime.AddSeconds(10); SnapshotTimestamp.SetSnapshotTimestamp(rightTime); leftTime = rightTime; } _historyDataSnapshotOver = true; }); }
internal ClientCoinSnapshotSet(IHostRoot root) { _root = root; Global.Access <Per10SecondEvent>( Guid.Parse("e093f476-e79d-45ba-b527-95ca71c3b737"), "周期性将内存中的CientCoinSpeedData列表刷到磁盘", LogEnum.Console, action: message => { InitOnece(); if (message.Seconds > 4 * 60) { throw new InvalidProgramException("内存中保留4分钟的数据,所以刷新周期不能大于4分钟"); } ClientCoinSnapshotData[] values = null; using (LiteDatabase db = HostRoot.CreateReportDb()) { var col = db.GetCollection <ClientCoinSnapshotData>(); lock (_locker) { // 将最近一个周期生成的数据刷入磁盘 DateTime time = message.Timestamp.AddSeconds(-message.Seconds); values = _dataList.Where(a => a.Timestamp > time).ToArray(); // 将4分钟之前的数据从内存中清除 time = message.Timestamp.AddMinutes(-4); List <ClientCoinSnapshotData> toRemoves = _dataList.Where(a => a.Timestamp < time).ToList(); foreach (var item in toRemoves) { _dataList.Remove(item); } } if (values.Length != 0) { col.Upsert(values); } Global.DebugLine("刷了" + values.Length + "条", ConsoleColor.Green); } }); Global.Access <Per2MinuteEvent>( Guid.Parse("033f4391-6b37-4232-abf4-c12117b4716b"), "周期性清除已经拍过快照的CientCoinSpeedData源数据", LogEnum.Console, action: message => { InitOnece(); DateTime timestamp = SnapshotTimestamp.GetSnapshotTimestamp(); if (timestamp == DateTime.MinValue) { Global.DebugLine("尚没有拍摄过快照,无需清除"); return; } using (LiteDatabase db = HostRoot.CreateReportDb()) { var col = db.GetCollection <ClientCoinSnapshotData>(); int r = col.Delete(Query.LT(nameof(ClientCoinSnapshotData.Timestamp), timestamp)); if (r > 0) { db.Shrink(); } } }); }