Example #1
0
        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;
            });
        }
Example #2
0
 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();
             }
         }
     });
 }