using System.Collections.Concurrent; using YLErp.Abstract; namespace YLErp.Modules.TradeRiskCalcModule.TaskRunner { /// /// [线程安全]收益互换多空组合数据源 /// class TradeSwapDataSource : ITradeExtendUpdater, IDataUpdater { readonly Guid _eventGuid; readonly ConcurrentDictionary _dic; private TradeSwapDataSource() { _dic = new ConcurrentDictionary(); _eventGuid = Events.EventBus.Subscribe(t => { UpdateData(t.TradeIds); }); } ~TradeSwapDataSource() { Events.EventBus.Unsubscribe(_eventGuid); } public List GetDatas(int tradId) { if (!_dic.TryGetValue(tradId, out var datas)) { using (var db = DbContextFactory.GetYLDbContext()) { _dic[tradId] = datas = db.trade_swap_detail.AsNoTracking() .Where(n => n.TradeId == tradId && n.ValidState != "InValid").ToArray(); } } return datas.Select(t => t.Clone()).ToList(); } /// /// 跟随trade更新 /// public void UpdateData(IEnumerable tradeIds) { if (_dic.Count > 5000) { _dic.Clear(); return; } if (tradeIds == null || !tradeIds.Any()) { return; } foreach (var tradId in tradeIds) { _dic.TryRemove(tradId, out _); } } public void UpdateData(IEnumerable updateKeyIds) { var tradeIds = DataConvert.ConvertToInt32Array(updateKeyIds); this.UpdateData(tradeIds); } /// /// 偷个懒使用这个 /// public static readonly TradeSwapDataSource Default; public string TableName => "trade_swap_detail"; static TradeSwapDataSource() { Default = new TradeSwapDataSource(); } } }