领胜LDS 键盘AOI检测项目
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; }
@@ -848,6 +848,11 @@
        bool IsAddtionalSaved { get; set; }
        event Action<ImageSet> OnImageSetTimeout;
        /// <summary>
        /// 序列化操作的图像信息
        /// </summary>
        string ImageData { get; set; }
    }
    public class ImageSet : IImageSet
@@ -887,29 +892,27 @@
        public object SaveLock { get; set; } = new object();
        public virtual string ImageData { get; set; }
        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
    }