From eafdcc5ad6a55d3dfdec6c4787c3f3a9f32efc7f Mon Sep 17 00:00:00 2001
From: xcd <834800634@qq.com>
Date: 星期二, 29 九月 2020 13:27:50 +0800
Subject: [PATCH] 1. M071B机台配置 2. GTS板卡添加回原点捕获模式和输入信号模式 3. CameraBase使用Dictionary类型做图片缓存 4. M071流程显式Copy,原来是为了避免内存泄漏,但目前来看不是这方面原因 5. Gocator驱动添加GoDataSet之类KObject资源显式回收,怀疑其中也有非托管对象资源,测试确实起到内存回收作用

---
 src/Bro.Common.Device/DeviceBase/CameraBase.cs |   44 ++++++++++++++++++++------------------------
 1 files changed, 20 insertions(+), 24 deletions(-)

diff --git a/src/Bro.Common.Device/DeviceBase/CameraBase.cs b/src/Bro.Common.Device/DeviceBase/CameraBase.cs
index 82b529d..85b5458 100644
--- a/src/Bro.Common.Device/DeviceBase/CameraBase.cs
+++ b/src/Bro.Common.Device/DeviceBase/CameraBase.cs
@@ -155,7 +155,7 @@
             set.IsAddtionalSaved = string.IsNullOrWhiteSpace(set.ImageSaveOption.AddtionalSaveType);
             set.OnImageSetTimeout += ImageSet_OnImageSetTimeout;
 
-            _imageSetList.Add(set);
+            _imageSetList[set.Id] = set;
         }
 
         /// <summary>
@@ -175,7 +175,8 @@
         #endregion
 
         #region 鍥剧墖缂撳瓨/淇濆瓨
-        public readonly ConcurrentBag<IImageSet> _imageSetList = new ConcurrentBag<IImageSet>();
+        //public readonly ConcurrentBag<IImageSet> _imageSetList = new ConcurrentBag<IImageSet>();
+        protected Dictionary<string, IImageSet> _imageSetList = new Dictionary<string, IImageSet>();
 
         public void NewImageSet(IImageSet set)
         {
@@ -183,7 +184,7 @@
             set.IsFitSaved = !set.ImageSaveOption.IsSaveFitImage;
             set.IsAddtionalSaved = string.IsNullOrWhiteSpace(set.ImageSaveOption.AddtionalSaveType);
             set.OnImageSetTimeout += ImageSet_OnImageSetTimeout;
-            _imageSetList.Add(set);
+            _imageSetList[set.Id] = set;
         }
 
         //public virtual async void UpdateFitElements(List<IShapeElement> eleList, string imgSetId)
@@ -201,7 +202,7 @@
                 OnImageUpdated?.Invoke(this, showImage, imgSetId);
             });
 
-            IImageSet set = _imageSetList.FirstOrDefault(u => u.Id == imgSetId);
+            IImageSet set = _imageSetList[imgSetId];
 
             if (set == null)
                 return;
@@ -236,7 +237,7 @@
             if (eleList.Count > 0)
                 OnElementsUpdated?.BeginInvoke(this, eleList, imgSetId, null, null);
 
-            IImageSet set = _imageSetList.FirstOrDefault(u => u.Id == imgSetId);
+            IImageSet set = _imageSetList[imgSetId];
             if (set == null)
                 return;
 
@@ -300,7 +301,7 @@
         {
             await Task.Run(() =>
             {
-                IImageSet set = _imageSetList.FirstOrDefault(u => u.Id == imgSetId);
+                IImageSet set = _imageSetList[imgSetId];
                 if (set == null)
                     return;
 
@@ -366,7 +367,7 @@
 
         //private Timer clearImageSetTimer = null;
 
-        public void ClearImageSet(IImageSet set)
+        public virtual void ClearImageSet(IImageSet set)
         {
             try
             {
@@ -375,9 +376,8 @@
                 //    && (!set.ImageSaveOption.IsSaveNGImage || set.IsNGSaved))
                 if (set.IsOriginSaved && set.IsFitSaved && set.IsAddtionalSaved)
                 {
-                    _imageSetList.TryTake(out set);
-                    set.Dispose();
-                    //LogAsync(DateTime.Now, $"绉婚櫎鍥剧墖淇℃伅锛屽綋鍓嶇紦瀛樻暟閲忥細{_imageSetList.Count}", "");
+                    _imageSetList.Remove(set.Id);
+                    LogAsync(DateTime.Now, $"绉婚櫎鍥剧墖淇℃伅锛屽綋鍓嶇紦瀛樻暟閲忥細{_imageSetList.Count}", "");
                 }
                 //bool flag = false;
 
@@ -397,7 +397,7 @@
 
         public void ClearImageSet(string imgSetId)
         {
-            IImageSet set = _imageSetList.First(u => u.Id == imgSetId);
+            IImageSet set = _imageSetList[imgSetId];
             if (set != null)
                 ClearImageSet(set);
         }
@@ -833,7 +833,7 @@
         }
     }
 
-    public interface IImageSet : IDisposable
+    public interface IImageSet:IDisposable
     {
         DateTime InitialTime { get; set; }
         string Id { get; }
@@ -897,26 +897,22 @@
         public event Action<ImageSet> OnImageSetTimeout;
         private Timer autoDisposeTimer = null;
 
-        private void OnAutoDispose(object state)
+        public void Dispose(object state)
         {
             OnImageSetTimeout?.Invoke(this);
-        }
 
-        public ImageSet()
-        {
-            autoDisposeTimer = new Timer(OnAutoDispose, null, 10 * 1000, -1);
+            autoDisposeTimer.Change(-1, -1);
+            autoDisposeTimer.Dispose();
         }
 
         public virtual void Dispose()
         {
-            autoDisposeTimer.Change(-1, -1);
-            autoDisposeTimer.Dispose();
+            Dispose(null);
+        }
 
-            //Image?.Dispose();
-            //Image = null;
-
-            //HImage?.Dispose();
-            //HImage = null;
+        public ImageSet()
+        {
+            autoDisposeTimer = new Timer(Dispose, null, 10 * 1000, -1);
         }
         #endregion
     }

--
Gitblit v1.8.0