Browse Source

sqlite并行操作卡死

wyq 9 months ago
parent
commit
f48524f184

BIN
Service/CpuCgServer/AddIns/XcorrCpu.exe


+ 1 - 0
XdCxRhDW.App/Controllers/TaskController.cs

@@ -65,6 +65,7 @@ namespace XdCxRhDW.App.Controllers
                     item.TaskState = EnumTaskState.Stopped;
                     await db.SaveChangesAsync();
                 }
+                X2D1PosRefService.Instance.Stop(dto.ID);
                 Messenger.Defalut.Pub("任务状态改变", dto.ID);
                 if (dto.StopType == EnumTaskStopType.Properly)
                     Serilog.Log.Information($"任务停止完成,ID={dto.ID},停止原因={dto.StopReason}");

+ 111 - 69
XdCxRhDW.App/MainForm.cs

@@ -173,7 +173,7 @@ namespace XdCxRhDW
             }
             catch (Exception ex)
             {
-                LogHelper.Error("同步数据库结构异常",ex).Wait(5000);
+                LogHelper.Error("同步数据库结构异常", ex).Wait(5000);
             }
         }
         private void StartWebApi()
@@ -225,7 +225,6 @@ namespace XdCxRhDW
                         var res = await HttpHelper.PostRequestAsync<RecordRes>(SysConfig.GetUrl("Xl/ImportTleAsync"), dto);
                         if (res.code == 200)
                         {
-
                             LogHelper.Info($"星历文件[{file}]自动导入成功!").Wait(5000);
                             //导入完成的文件放在备份目录
                             var baseDirectory = Path.Combine(backUpDir, "TleBackUp");
@@ -242,40 +241,53 @@ namespace XdCxRhDW
                     }
                     catch (Exception ex)
                     {
-                        LogHelper.Error($"星历文件[{file}]自动导入失败",ex).Wait(5000);
+                        LogHelper.Error($"星历文件[{file}]自动导入失败", ex).Wait(5000);
+                        await Task.Delay(5000);
+                    }
+                    finally
+                    {
+                        await Task.Delay(2000);
                     }
                 }
 
             }
         }
-
-        //清理180天之前导入的星历
+        //清理1年之前导入的星历
         private async Task XlClear()
         {
             while (true)
             {
                 try
                 {
+                    List<XlInfo> clearData = new List<XlInfo>();
                     using (RHDWContext db = new RHDWContext())
                     {
-                        DateTime dt = DateTime.Now.AddDays(-180);
-                        var clearData = await db.XlInfos.Where(p => p.UpdateTime < dt).Take(1000).ToListAsync();
-                        if (clearData.Any())
+                        DateTime dt = DateTime.Now.AddYears(-1);
+                        clearData = await db.XlInfos.Where(p => p.UpdateTime < dt).Take(1000).ToListAsync();
+                    }
+                    if (!clearData.Any())
+                    {
+                        await Task.Delay(60 * 1000);
+                    }
+                    else
+                    {
+                        using (RHDWContext db = new RHDWContext())
                         {
-                            //db.XlInfos.RemoveRange(clearData);
+                            db.XlInfos.RemoveRange(clearData);
                             await db.SaveChangesAsync();
-                            await Task.Delay(2000);
-                        }
-                        else
-                        {
-                            await Task.Delay(60 * 1000);
                         }
+
                     }
+
                 }
                 catch (Exception ex)
                 {
                     await LogHelper.Error("清理过期星历异常", ex);
                 }
+                finally
+                {
+                    await Task.Delay(2000);
+                }
 
             }
         }
@@ -287,62 +299,81 @@ namespace XdCxRhDW
             {
                 try
                 {
+                    List<XlInfo> calcItems = null;
+                    List<SatInfo> satInfo = null;
                     using (RHDWContext db = new RHDWContext())
                     {
-                        var calcItems = await db.XlInfos.Where(p => p.Lon == null).OrderByDescending(p => p.SatCode).Take(1000).ToListAsync();
-                        if (calcItems.Any())
+                        calcItems = await db.XlInfos.Where(p => p.Lon == null).OrderByDescending(p => p.SatCode).Take(100).ToListAsync();
+                        satInfo = await db.SatInfos.ToListAsync();
+                    }
+                    if (calcItems != null && calcItems.Any())
+                    {
+                        var firstUpdateItems = calcItems.Where(p => satInfo.Any(t => t.SatCode == p.SatCode)).ToList();
+
+                        await Task.Run(() =>
                         {
-                            var satInfo = await db.SatInfos.ToListAsync();
-                            var firstUpdateItems = calcItems.Where(p => satInfo.Any(t => t.SatCode == p.SatCode)).ToList();
-                            await Task.Run(() =>
+                            List<XlInfo> Level1 = new List<XlInfo>();
+                            foreach (var item in firstUpdateItems)
                             {
-                                foreach (var item in firstUpdateItems)
+                                try
                                 {
-                                    try
-                                    {
-                                        var eph = EphHelper.Calc(item.TwoLine, item.TimeUTC);
-                                        item.Lon = Math.Round(PhysicsHelper.EcefToGeo((eph.X, eph.Y, eph.Z)).lon, 1);
-
-                                    }
-                                    catch (Exception ex)
-                                    {
-                                        item.Lon = -999;
-                                        LogHelper.Error($"[{item.TwoLine}]推算XYZ星历出错!", ex).Wait(5000);
-                                    }
-                                    db.XlInfos.AddOrUpdate(item);
-                                    db.SaveChangesAsync();
+                                    var eph = EphHelper.Calc(item.TwoLine, item.TimeUTC);
+                                    item.Lon = Math.Round(PhysicsHelper.EcefToGeo((eph.X, eph.Y, eph.Z)).lon, 1);
+                                    Level1.Add(item);
                                     calcItems.Remove(item);
                                 }
-
-                                foreach (var item in calcItems)
+                                catch (Exception ex)
                                 {
-                                    try
-                                    {
-                                        var eph = EphHelper.Calc(item.TwoLine, item.TimeUTC);
-                                        item.Lon = Math.Round(PhysicsHelper.EcefToGeo((eph.X, eph.Y, eph.Z)).lon, 1);
-
-                                    }
-                                    catch (Exception ex)
-                                    {
-                                        item.Lon = -999;
-                                        LogHelper.Error($"[{item.TwoLine}]推算XYZ星历出错!", ex).Wait(5000);
-                                    }
-                                    db.XlInfos.AddOrUpdate(item);
-                                    db.SaveChangesAsync();
+                                    item.Lon = -999;
+                                    LogHelper.Error($"[{item.TwoLine}]推算XYZ星历出错!", ex).Wait(5000);
                                 }
-                            });
-
-                        }
-                        else
-                        {
-                            await Task.Delay(60 * 1000);
-                        }
+                            }
+                            if (Level1.Any())
+                            {
+                                using (RHDWContext db = new RHDWContext())
+                                {
+                                    db.XlInfos.AddOrUpdate(Level1.ToArray());
+                                    db.SaveChanges();
+                                }
+                            }
+                            List<XlInfo> Level2 = new List<XlInfo>();
+                            foreach (var item in calcItems)
+                            {
+                                try
+                                {
+                                    var eph = EphHelper.Calc(item.TwoLine, item.TimeUTC);
+                                    item.Lon = Math.Round(PhysicsHelper.EcefToGeo((eph.X, eph.Y, eph.Z)).lon, 1);
+                                    Level2.Add(item);
+                                }
+                                catch (Exception ex)
+                                {
+                                    item.Lon = -999;
+                                    LogHelper.Error($"[{item.TwoLine}]推算XYZ星历出错!", ex).Wait(5000);
+                                }
+                            }
+                            if (Level2.Any())
+                            {
+                                using (RHDWContext db = new RHDWContext())
+                                {
+                                    db.XlInfos.AddOrUpdate(Level2.ToArray());
+                                    db.SaveChanges();
+                                }
+                            }
+                        });
+                    }
+                    else
+                    {
+                        await Task.Delay(60 * 1000);
                     }
                 }
                 catch (Exception ex)
                 {
                     LogHelper.Error($"推算XYZ星历出错!", ex).Wait(5000);
                 }
+                finally
+                {
+                    await Task.Delay(5000);
+                }
             }
         }
 
@@ -380,25 +411,36 @@ namespace XdCxRhDW
 
         private async Task ClearLog()
         {
-            using (RHDWLogContext db = new RHDWLogContext())
+            while (true)
             {
-                try
+                using (RHDWLogContext db = new RHDWLogContext())
                 {
-                    var time1 = DateTime.Today.AddDays(-7);
-                    var time2 = DateTime.Today.AddDays(-30);
-                    var delItems = await db.LogRes.Where(p => p.LogTime < time1 && p.LogType != EnumLogType.Error).ToListAsync();
-                    db.LogRes.RemoveRange(delItems);
+                    try
+                    {
+                        var time1 = DateTime.Today.AddDays(-7);
+                        var time2 = DateTime.Today.AddDays(-30);
+                        var delItems = await db.LogRes.Where(p => p.LogTime < time1 && p.LogType != EnumLogType.Error).Take(500).ToListAsync();
+                        db.LogRes.RemoveRange(delItems);
 
-                    var delItems2 = await db.LogRes.Where(p => p.LogTime < time2 && p.LogType == EnumLogType.Error).ToListAsync();
-                    db.LogRes.RemoveRange(delItems2);
-                    await db.SaveChangesAsync();
-                }
-                catch (Exception ex)
-                {
-                    await LogHelper.Error("清理日志信息异常", ex);
+                        var delItems2 = await db.LogRes.Where(p => p.LogTime < time2 && p.LogType == EnumLogType.Error).Take(500).ToListAsync();
+                        db.LogRes.RemoveRange(delItems2);
+                        await db.SaveChangesAsync();
+                        if (!delItems.Any() && !delItems2.Any())
+                        {
+                            break;
+                        }
+                    }
+                    catch (Exception ex)
+                    {
+                        await LogHelper.Error("清理日志信息异常", ex);
+                        await Task.Delay(10000);
+                    }
+                    finally
+                    {
+                        await Task.Delay(5000);
+                    }
                 }
             }
-            await Task.Delay(3600 * 1000);
         }
 
         private void btn_ItemClick(object sender, ItemClickEventArgs e)

+ 18 - 0
XdCxRhDW.App/UserControl/CtrlHome.cs

@@ -5,6 +5,7 @@ using DevExpress.Utils.Drawing;
 using DevExpress.Utils.Svg;
 using DevExpress.XtraEditors.ButtonsPanelControl;
 using DevExpress.XtraEditors.Controls;
+using DevExpress.XtraGrid;
 using DevExpress.XtraGrid.Views.Grid;
 using DPP_YH_Core.Extensions;
 using DxHelper;
@@ -54,6 +55,7 @@ namespace XdCxRhDW.App.UserControl
 
         private async void CtrlHome_Load(object sender, EventArgs e)
         {
+            gridView2.ColumnFilterChanged += GridView2_ColumnFilterChanged;
             Messenger.Defalut.Sub<ModelPosRes>("新增定位点", OnPosAdd);
             Messenger.Defalut.Sub<SysSetings>("地图类型改变", OnSysSetingsChanged);
             Messenger.Defalut.Sub<int>("任务状态改变", async id =>
@@ -168,6 +170,22 @@ namespace XdCxRhDW.App.UserControl
             WaitHelper.CloseForm();
         }
 
+        private void GridView2_ColumnFilterChanged(object sender, EventArgs e)
+        {
+            try
+            {
+                //ModelPosRes
+                List<ModelPosRes> data = gridView2.DataController.GetAllFilteredAndSortedRows().OfType<ModelPosRes>().ToList();
+                mapControl1.SetPosDataSource(data);
+            }
+            catch (Exception ex)
+            {
+                Serilog.Log.Error(ex, "筛选定位结果异常");
+                DxHelper.MsgBoxHelper.ShowError("筛选定位结果异常");
+            }
+          
+        }
+
         private void OnSysSetingsChanged(SysSetings settings)
         {
             if (settings.MapType == 0)

+ 66 - 60
XdCxRhDW.App/X2D1PosRef/X2D1PosHandle.cs

@@ -84,79 +84,85 @@ namespace XdCxRhDW.App
                                     listNoRef.Add(dto);
                                     continue;
                                 }
+                                List<CgRes> cgResRefs = new List<CgRes>();
                                 using (RHDWPartContext db = RHDWPartContext.GetContext(dto.SigTime, true))
                                 {
                                     DateTime min = dto.SigTime.AddSeconds(-takeRefTimeSeconds);
                                     DateTime max = dto.SigTime.AddSeconds(takeRefTimeSeconds);
                                     //获取设定分钟之内的固定站数据
-                                    var cgResRefs = await db.CgRes.Where(m => m.TaskID == dto.TaskID && m.FixedStationID == dto.FixedStationId && m.SigTime >= min && m.SigTime <= max).OrderBy(d => d.SigTime).ToListAsync();
+                                    cgResRefs = await db.CgRes.Where(m => m.TaskID == dto.TaskID && m.FixedStationID == dto.FixedStationId && m.SigTime >= min && m.SigTime <= max).OrderBy(d => d.SigTime).ToListAsync();
+                                }
 
-                                    List<CgRes> matchCgList = new List<CgRes>();
-                                    cgResRefs.ForEach(c =>
+                                List<CgRes> matchCgList = new List<CgRes>();
+                                cgResRefs.ForEach(c =>
+                                {
+                                    if ((dto.SigTime - c.SigTime).TotalSeconds <= takeRefTimeSeconds)
                                     {
-                                        if ((dto.SigTime - c.SigTime).TotalSeconds <= takeRefTimeSeconds)
-                                        {
-                                            matchCgList.Add(c);
-                                        }
-                                    });
-                                    var cgOrderList = matchCgList.OrderBy(d => d.SigTime).ToList();
-                                    var point1 = cgOrderList.Where(c => c.SigTime <= dto.SigTime).FirstOrDefault();
-                                    var point2 = cgOrderList.Where(c => c.SigTime >= dto.SigTime).FirstOrDefault();
+                                        matchCgList.Add(c);
+                                    }
+                                });
+                                var cgOrderList = matchCgList.OrderBy(d => d.SigTime).ToList();
+                                var point1 = cgOrderList.Where(c => c.SigTime <= dto.SigTime).FirstOrDefault();
+                                var point2 = cgOrderList.Where(c => c.SigTime >= dto.SigTime).FirstOrDefault();
 
-                                    if (point1 == null || point2 == null)//若参考频点未出结果,查找目标信号出
+                                if (point1 == null || point2 == null)//若参考频点未出结果,查找目标信号出
+                                {
+                                    if ((DateTime.Now - posItem.CreateTime).TotalMinutes >= 2)//两分钟之内未出结果走无参
                                     {
-                                        if ((DateTime.Now - posItem.CreateTime).TotalMinutes >= 2)//两分钟之内未出结果走无参
-                                        {
-                                            await LogHelper.Warning($"任务{dto.TaskID}-{dto.SigTime:yyyy-MM-dd HH:mm:ss}参考未出结果超时");
-                                            posItem.IsDw = true;
-                                            listNoRef.Add(dto);
-                                            continue;
-                                        }
-                                        bool isTarAny = await db.CgRes.AnyAsync(m => m.TaskID == dto.TaskID && !m.FixedStationID.HasValue && m.TarFreqUp.HasValue && m.TarFreqUp.Value == fixedStation.FreqUpHz && m.SigTime >= dto.SigTime);
-                                        if (!isTarAny && (DateTime.Now - posItem.CreateTime).TotalMinutes < 2)//目标未出结果
-                                        {
-                                            posItem.IsDw = false;
-                                            continue;
-                                        }
-                                       
+                                        await LogHelper.Warning($"任务{dto.TaskID}-{dto.SigTime:yyyy-MM-dd HH:mm:ss}参考未出结果超时");
+                                        posItem.IsDw = true;
+                                        listNoRef.Add(dto);
+                                        continue;
                                     }
-                                    if (point1 != null && point2 != null)
+                                    bool isTarAny = false;
+                                    using (RHDWPartContext db = RHDWPartContext.GetContext(dto.SigTime, true))
                                     {
-                                        posItem.IsDw = true;
-                                        //通过双星时差及超短波时差怎么计算参考信息的时差
-                                        double refDto = LinearInterpolation.CalSigTimeDto(dto.SigTime, point1.SigTime, point2.SigTime, point1.Dto1.Value, point2.Dto1.Value);
-                                        double refDtoCdb = LinearInterpolation.CalSigTimeDto(dto.SigTime, point1.SigTime, point2.SigTime, point1.DtoCdb.Value, point2.DtoCdb.Value);
-
-                                        //执行两星一地有参定位
-                                        X2D1NoXlPosDto X2D1NoXlPosDto = new X2D1NoXlPosDto()
-                                        {
-                                            SigTime = dto.SigTime,
-                                            MainCode = dto.MainCode,
-                                            AdjaCode = dto.AdjaCode,
-                                            SxDto = dto.SxDto,
-                                            XdDto = dto.XdDto,
-                                            MainYbDto = refDto,
-                                            AdjaYbDto = refDtoCdb,
-                                            SatTxLon = dto.SatTxLon,
-                                            SatTxLat = dto.SatTxLat,
-                                            CdbTxLon = dto.CdbTxLon,
-                                            CdbTxLat = dto.CdbTxLat,
-                                            RefLon = fixedStation.Lon,
-                                            RefLat = fixedStation.Lat,
-                                            FreqDown = dto.FreqDown,
-                                            FreqUp = dto.FreqUp,
-                                            XdDfo = dto.XdDfo,
-                                            XdSnr = dto.XdSnr,
-                                            SxDfo = dto.SxDfo,
-                                            SxSnr = dto.SxSnr,
-                                            CalcConfidence = true,
-                                            TheoryDfoCalc = true,
-                                            TaskID = dto.TaskID,
-                                            CheckRes = dto.CheckRes,
-                                        };
-                                        listRef.Add(X2D1NoXlPosDto);
+                                        isTarAny = await db.CgRes.AnyAsync(m => m.TaskID == dto.TaskID && !m.FixedStationID.HasValue && m.TarFreqUp.HasValue && m.TarFreqUp.Value == fixedStation.FreqUpHz && m.SigTime >= dto.SigTime);
+                                    }
+                                    if (!isTarAny && (DateTime.Now - posItem.CreateTime).TotalMinutes < 2)//目标未出结果
+                                    {
+                                        posItem.IsDw = false;
+                                        continue;
                                     }
+
+                                }
+                                if (point1 != null && point2 != null)
+                                {
+                                    posItem.IsDw = true;
+                                    //通过双星时差及超短波时差怎么计算参考信息的时差
+                                    double refDto = LinearInterpolation.CalSigTimeDto(dto.SigTime, point1.SigTime, point2.SigTime, point1.Dto1.Value, point2.Dto1.Value);
+                                    double refDtoCdb = LinearInterpolation.CalSigTimeDto(dto.SigTime, point1.SigTime, point2.SigTime, point1.DtoCdb.Value, point2.DtoCdb.Value);
+
+                                    //执行两星一地有参定位
+                                    X2D1NoXlPosDto X2D1NoXlPosDto = new X2D1NoXlPosDto()
+                                    {
+                                        SigTime = dto.SigTime,
+                                        MainCode = dto.MainCode,
+                                        AdjaCode = dto.AdjaCode,
+                                        SxDto = dto.SxDto,
+                                        XdDto = dto.XdDto,
+                                        MainYbDto = refDto,
+                                        AdjaYbDto = refDtoCdb,
+                                        SatTxLon = dto.SatTxLon,
+                                        SatTxLat = dto.SatTxLat,
+                                        CdbTxLon = dto.CdbTxLon,
+                                        CdbTxLat = dto.CdbTxLat,
+                                        RefLon = fixedStation.Lon,
+                                        RefLat = fixedStation.Lat,
+                                        FreqDown = dto.FreqDown,
+                                        FreqUp = dto.FreqUp,
+                                        XdDfo = dto.XdDfo,
+                                        XdSnr = dto.XdSnr,
+                                        SxDfo = dto.SxDfo,
+                                        SxSnr = dto.SxSnr,
+                                        CalcConfidence = true,
+                                        TheoryDfoCalc = true,
+                                        TaskID = dto.TaskID,
+                                        CheckRes = dto.CheckRes,
+                                    };
+                                    listRef.Add(X2D1NoXlPosDto);
                                 }
+
                             }
                             catch (Exception ex)
                             {

+ 3 - 46
XdCxRhDW.App/X2D1PosRef/X2D1PosRefService.cs

@@ -26,51 +26,8 @@ namespace XdCxRhDW.App
         public X2D1PosRefService()
         {
             TakeRefTime = AppConfigHelper.Get("TakeRefTime", 10);
-            StartMonitor();
-        }
-        public void StartMonitor()
-        {
-            Task.Run(async () =>
-            {
-                while (true)
-                {
-                    if (handles.Count == 0)
-                    {
-                        Thread.Sleep(5000);
-                    }
-                    try
-                    {
-                        lock (this)
-                        {
-                            List<X2D1PosHandle> deletes = new List<X2D1PosHandle>();
-                            using (RHDWContext db = new RHDWContext())
-                            {
-                                for (int i = 0; i < handles.Count; i++)
-                                {
-                                    var handle = handles[i];
-                                    var runTask = db.TaskInfos.FirstOrDefault(p => p.ID == handle.TaskId && p.TaskState == EnumTaskState.Running);
-                                    if (runTask == null)
-                                    {
-                                        handle.Stop();
-                                        deletes.Add(handle);
-                                    }
-                                }
-
-                            }
-                            //删除未运行的任务
-                            handles.RemoveAll(r => deletes.Any(d => d.TaskId == r.TaskId));
-                        }
-                        Thread.Sleep(5000);
-                    }
-                    catch (Exception ex)
-                    {
-                       await LogHelper.Error($"【监视取参考任务运行状态异常,{ex.Message}",ex);
-
-                    }
-
-                }
-            });
         }
+       
         public void AddPosDto(List<X2D1NoXlNoParlPosDto> dtos)
         {
             try
@@ -90,7 +47,7 @@ namespace XdCxRhDW.App
             }
             catch (Exception ex)
             {
-              LogHelper.Error($"【任务{dtos.First().TaskID}】添加取参考信号流程异常,{ex.Message}",ex).GetAwaiter();
+                LogHelper.Error($"【任务{dtos.First().TaskID}】添加取参考信号流程异常,{ex.Message}", ex).GetAwaiter();
 
             }
         }
@@ -110,7 +67,7 @@ namespace XdCxRhDW.App
             }
             catch (Exception ex)
             {
-                LogHelper.Error($"停止【任务{taskID}】取参考信号流程异常,{ex.Message}",ex).GetAwaiter();
+                LogHelper.Error($"停止【任务{taskID}】取参考信号流程异常,{ex.Message}", ex).GetAwaiter();
 
             }
         }