private int 批量增加GPS(ref string __当前表) { var __上报数据列表 = new List <M号码位置>(); M号码位置 __上报数据; //while ((_上报数据列表.TryTake(out __上报数据) || _上报数据列表.IsAddingCompleted) && !_上报数据列表.IsCompleted) while (_数据缓存.TryTake(out __上报数据)) { __上报数据列表.Add(__上报数据); } if (__上报数据列表.Count == 0) { return(0); } foreach (var __分组 in __上报数据列表.GroupBy(x => x.GPS.时间.Date)) { var __表名 = _表前缀 + __分组.Key.ToString("yyyyMMdd"); if (__当前表 != __表名) { var __sql = string.Format(_建一天位置表, __表名); Let.Us.Retry(1000, 100, null, exs => H调试.记录致命("建一天位置表失败:" + exs.Last().Message)).Do(() => { using (var __连接 = new SqlConnection(_连接字符串)) { SQLHelper.ExecuteNonQuery(__连接, __sql); } }); __当前表 = __表名; } 批量增加(__表名, __上报数据列表); } return(__上报数据列表.Count); }
public DGPS数据() { _连接字符串 = new SqlConnectionStringBuilder { DataSource = H程序配置.获取字符串("数据库地址"), UserID = H程序配置.获取字符串("数据库账号"), Password = H程序配置.获取字符串("数据库密码"), InitialCatalog = H程序配置.获取字符串("数据库名称"), IntegratedSecurity = false, UserInstance = false, }.ToString(); Let.Us.Retry(1000, 100, null, exs => H调试.记录致命("建最后位置表失败:" + exs.Last().Message)).Do(() => { using (var __连接 = new SqlConnection(_连接字符串)) { SQLHelper.ExecuteNonQuery(__连接, _建最后位置表); } }); DataTable __位置表; Dictionary <int, DataRow> __位置映射; _最后位置 = 查询最后位置(out __位置表, out __位置映射); Task.Factory.StartNew(() => { var __当前表 = ""; while (true) { var __更新数量 = 0; Let.Us.DoAndSleep(_批量增加GPS频率, __耗时 => H调试.记录(string.Format("批量增加GPS {1} 条, 耗时 {0} 毫秒", __耗时, __更新数量))) .Do(() => __更新数量 = 批量增加GPS(ref __当前表)); } }); Task.Factory.StartNew(() => { while (true) { var __更新数量 = 0; Let.Us.DoAndSleep(_批量更新最后GPS频率, __耗时 => H调试.记录(string.Format("批量更新最后GPS {1} 条, 耗时 {0} 毫秒", __耗时, __更新数量))) .Do(() => { __更新数量 = 批量更新最后GPS(__位置表, __位置映射); }); //var __秒表 = new Stopwatch(); //__秒表.Start(); //var __更新数量 = 批量更新最后GPS(__位置表, __位置映射); //__秒表.Stop(); //H调试.记录(string.Format("批量更新最后GPS {1} 耗时 {0} 毫秒", __秒表.Elapsed.TotalMilliseconds, __更新数量)); //var __休眠 = _批量更新最后GPS频率 - (int)__秒表.Elapsed.TotalMilliseconds; //if (__休眠 > 0) //{ // Thread.Sleep(__休眠); //} } }); }
/// <summary> /// EXCEPTION_EXECUTE_HANDLER == 1 表示我已经处理了异常,可以优雅地结束了 /// EXCEPTION_CONTINUE_SEARCH == 0 表示我不处理,其他人来吧,于是windows调用默认的处理程序显示一个错误框,并结束 /// EXCEPTION_CONTINUE_EXECUTION e== -1 表示错误已经被修复,请从异常发生处继续执行。 /// </summary> /// <param name="a"></param> /// <returns></returns> private static Int32 最后处理异常(ref long a) { var __文件名 = "未处理异常"; if (!_获取是否DotNet异常()) { H调试.记录致命("!!!跨平台(P/INVOKE)调用异常 !!!"); __文件名 = "跨平台调用异常"; } __文件名 += DateTime.Now.ToString("yyyy年MM月dd日 HH时mm分ss秒"); 记录(string.Format("{0}\\{1}.dmp", H调试.日志目录, __文件名)); H调试.截屏(__文件名); return(1); }
private int 批量增加GPS(ref string __当前表) { var __上报数据列表 = new List <M号码位置>(); M号码位置 __上报数据; //while ((_上报数据列表.TryTake(out __上报数据) || _上报数据列表.IsAddingCompleted) && !_上报数据列表.IsCompleted) while (_数据缓存.TryTake(out __上报数据)) { __上报数据列表.Add(__上报数据); } foreach (var __分组 in __上报数据列表.GroupBy(x => x.GPS.时间.Date)) { var __表名 = _表前缀 + __分组.Key.ToString("yyyyMMdd"); if (__当前表 != __表名) { var __sql = string.Format(_建一天位置表, __表名); Let.Us.Retry(1000, 100, null, exs => H调试.记录致命("建一天位置表失败:" + exs.Last().Message)).Do(() => { using (var __连接 = new SqlConnection(_连接字符串)) { SQLHelper.ExecuteNonQuery(__连接, __sql); } }); __当前表 = __表名; } var _一天位置表 = new DataTable(); _一天位置表.Columns.AddRange(new[] { new DataColumn("号码", typeof(int)), new DataColumn("时间", typeof(DateTime)), new DataColumn("经度", typeof(decimal)), new DataColumn("纬度", typeof(decimal)), new DataColumn("高度", typeof(short)), new DataColumn("速度", typeof(short)), new DataColumn("方向", typeof(short)), new DataColumn("精度", typeof(short)), }); __上报数据列表.ForEach(__数据 => { var __行 = _一天位置表.NewRow(); 设置行(__行, __数据.号码, __数据.GPS); _一天位置表.Rows.Add(__行); }); using (var __批量复制 = new SqlBulkCopy(_连接字符串 /*, SqlBulkCopyOptions.TableLock*/)) { __批量复制.BatchSize = 500; __批量复制.DestinationTableName = __表名; __批量复制.ColumnMappings.Add("号码", "号码"); __批量复制.ColumnMappings.Add("时间", "时间"); __批量复制.ColumnMappings.Add("经度", "经度"); __批量复制.ColumnMappings.Add("纬度", "纬度"); __批量复制.ColumnMappings.Add("高度", "高度"); __批量复制.ColumnMappings.Add("速度", "速度"); __批量复制.ColumnMappings.Add("方向", "方向"); __批量复制.ColumnMappings.Add("精度", "精度"); __批量复制.WriteToServer(_一天位置表); } } return(__上报数据列表.Count); }
public DGPS数据() { _连接字符串 = new SqlConnectionStringBuilder { DataSource = H程序配置.获取字符串("数据库地址"), UserID = H程序配置.获取字符串("数据库账号"), Password = H程序配置.获取字符串("数据库密码"), InitialCatalog = H程序配置.获取字符串("数据库名称"), IntegratedSecurity = false, UserInstance = false, }.ToString(); Let.Us.Retry(1000, 100, null, exs => H调试.记录致命("建最后位置表失败:" + exs.Last().Message)).Do(() => { using (var __连接 = new SqlConnection(_连接字符串)) { SQLHelper.ExecuteNonQuery(__连接, _建最后位置表); } }); _最后位置 = 查询最后位置(); Task.Factory.StartNew(() => { var __当前表 = ""; while (true) { try { var __更新数量 = 0; Let.Us.DelayAfter(_批量增加GPS频率, __耗时 => { if (__耗时 > 1000) { H调试.记录(string.Format("批量增加GPS {1} 条, 耗时 {0} 毫秒", __耗时, __更新数量)); } }) .Do(() => __更新数量 = 批量增加GPS(ref __当前表)); } catch (Exception ex) { H调试.记录异常(ex); } } }); Task.Factory.StartNew(() => { while (true) { try { var __更新数量 = 0; Let.Us.DelayAfter(_批量更新最后GPS频率, __耗时 => { if (__耗时 > 1000) { H调试.记录(string.Format("批量更新最后GPS {1} 条, 耗时 {0} 毫秒", __耗时, __更新数量)); } }) .Do(() => { __更新数量 = 批量更新最后GPS(); }); } catch (Exception ex) { H调试.记录异常(ex); } } }); }