/// <summary>数据交换-泵出(线程处理蹦出数据) /// </summary> /// <param name="nStepSwaps"></param> /// <param name="nFrequency"></param> /// <returns></returns> protected virtual bool thrdSwapData_Out(int nStepSwaps = 1, int nFrequency = 1000) { while (_nSteps != 0) { try { _nSteps--; AckInfo ackInfo = null; List <dynamic> lstDatas = SwapData_In(nStepSwaps, out ackInfo); if (this.SwapData_Change != null) { if (lstDatas.Count > 0) { this.SwapData_Change(this, this.CreateDataSwap_EventArgs(lstDatas, ackInfo)); } } Thread.Sleep(nFrequency); //模拟长时间运算 //确认操作监测、修正 this.SwapData_Check(); } catch (Exception e) { Console.WriteLine("Error(DataSwap IOFiles):" + e.ToString()); //throw; } } return(true); }
/// <summary>确认操作 /// </summary> /// <param name="ackInfo"></param> /// <returns></returns> public virtual bool SwapData_Ack(dynamic ackTag) { if (!_useAck) { return(false); } AckInfo pAckInfo = SwapData_AckQuery(ackTag); if (pAckInfo != null) { pAckInfo.Acked = true; return(true); } return(false); }
/// <summary>缓存确认信息 /// </summary> /// <param name="ackInfo"></param> /// <returns></returns> protected virtual bool SwapData_Buffer(string ackTag, dynamic ackInfo) { if (!_useAck) { return(false); } var query = _ackInfo.Where(e => e.AckTag == ackTag); if (query.Count() == 0) { AckInfo pAckInfo = new AckInfo(ackTag, ackInfo); _ackInfo.Add(pAckInfo); return(true); } return(false); }
/// <summary>是否缓存确认信息 /// </summary> /// <param name="ackInfo"></param> /// <returns></returns> protected virtual bool SwapData_AckNeed(dynamic ackTag) { if (!_useAck) { return(false); } AckInfo pAckInfo = SwapData_AckQuery(ackTag); if (pAckInfo != null) { if (!pAckInfo.Acked) { return(true); } } return(false); }
/// <summary>创建数据交换事件对象 /// </summary> /// <param name="datas"></param> /// <param name="ackInfo"></param> /// <returns></returns> protected internal DataSwap_Event CreateDataSwap_EventArgs(List <dynamic> datas, AckInfo ackInfo = null) { DataSwap_Event pArgs = new DataSwap_Event(); pArgs._Datas = datas; pArgs._AckInfo = ackInfo; return(pArgs); }
/// <summary>数据交换-泵入 /// </summary> /// <param name="nStepSwaps">交换数据数量</param> /// <param name="ackInfo">交换确认信息</param> /// <returns></returns> public virtual List <dynamic> SwapData_In(int nStepSwaps, out AckInfo ackInfo) { ackInfo = null; return(null); }
public override List <dynamic> SwapData_In(int nStepSwaps, out AckInfo ackInfo) { int nums = 0; ackInfo = null; List <string> errs = new List <string>(); List <dynamic> lstDatas = new List <dynamic>(); nStepSwaps = nStepSwaps <= 0 ? int.MaxValue : nStepSwaps; var provider = new PhysicalFileProvider(_dirSwap); var contents = provider.GetDirectoryContents(string.Empty).OrderBy(e => e.Name); //升序排序 if (contents.Count() > 0) { if (_canDebug) { Console.WriteLine(DateTime.Now.ToLongTimeString() + " DataSwap IOFiles::"); Console.WriteLine("\t" + _dirSwap); Console.WriteLine("\tSwap IOFiles(" + contents.Count() + ")"); } foreach (var item in contents) { if (SwapData_AckNeed(item.PhysicalPath)) { continue; } if (item.IsDirectory) { continue; } if (_delayedTime > 0) //解析时间并校检 { if ((DateTime.Now - item.LastModified.LocalDateTime).TotalSeconds > _delayedTime) { this.SwapData_BackUp(item.PhysicalPath, _dirSwap_back); continue; } } if (item.Length == 0) { File.Delete(item.PhysicalPath); continue; } string strExtension = System.IO.Path.GetExtension(item.Name); if (strExtension != ".json" && strExtension != ".geojson") { continue; } if (item.Name.Substring(0, _tagName.Length) != _tagName) { continue; } using (System.IO.StreamReader file = System.IO.File.OpenText(item.PhysicalPath)) { if (_canDebug) { Console.WriteLine("\tnew file swap:: " + item.PhysicalPath); } using (JsonTextReader reader = new JsonTextReader(file)) { //循环解析文件json数据 JToken jsonFile = JToken.ReadFrom(reader); JArray jsonDatas = null; //提取数据,兼容多种格式 if (jsonFile.Type == JTokenType.Array) { jsonDatas = (JArray)jsonFile; } else { jsonDatas = (JArray)jsonFile["datas"]; } //循环生成数据对象 foreach (var jsonData in jsonDatas) { var data = this.CreateData_ClassObj(jsonData); lstDatas.Add(data); } } if (this.SwapData_BackUp(item.PhysicalPath, _dirSwap_back)) // 备份文件 { if (_useAck) //生成确认信息 { ackInfo = new AckInfo(item.Name, item.PhysicalPath); } this.SwapData_Buffer(item.Name, item.PhysicalPath); } nums++; if (nums >= nStepSwaps) { break; } } } if (_canDebug) { Console.WriteLine("DataSwap IOFiles End." + "\tMargin Swap IOFiles(" + (contents.Count()) + ")\n"); } } return(lstDatas); }