using System; using System.Collections.Concurrent; using System.Collections.Generic; using System.Drawing; using System.Drawing.Imaging; using System.IO; using System.Linq; using System.Text; using System.Threading; using System.Threading.Tasks; using DH.Commons.Helper; namespace DH.Commons.Enums { public class ImageSaveHelper { public event Action OnImageSaveExceptionRaised; //private string baseDirectory = ""; //public string BaseDirectory //{ // get => baseDirectory; // set // { // baseDirectory = value; // if (string.IsNullOrWhiteSpace(baseDirectory) || !Path.IsPathRooted(baseDirectory)) // { // baseDirectory = Path.Combine(AppDomain.CurrentDomain.BaseDirectory, "Images"); // } // } //} public bool EnableImageSave { get; set; } = true; public ImageSaveHelper() { } public ImageSaveHelper(bool enableImageSave = true) { EnableImageSave = enableImageSave; } object lockObj = new object(); ////耗时操作从 _taskFactory分配线程 //public TaskFactory _taskFactory = new TaskFactory(TaskCreationOptions.LongRunning, TaskContinuationOptions.LongRunning); readonly ConcurrentQueue _imageQueue = new ConcurrentQueue(); Task _saveTask = null; readonly object _saveLock = new object(); public async void ImageSaveAsync(ImageSaveSet set) { if (!EnableImageSave) return; await Task.Run(() => { _imageQueue.Enqueue(set); lock (_saveLock) { if (_saveTask == null) { _saveTask = Task.Run(async () => { try { while (true) { while (_imageQueue.Count > 0) { if (_imageQueue.TryDequeue(out ImageSaveSet saveSet)) { if (!Directory.Exists(Path.GetDirectoryName(saveSet.FullName))) { Directory.CreateDirectory(Path.GetDirectoryName(saveSet.FullName)); } if (saveSet.SaveImage != null) { saveSet.SaveImage.Save(saveSet.FullName, saveSet.ImageFormat); saveSet.SaveImage.Dispose(); } saveSet = null; } } await Task.Delay(2000); } } catch (Exception ex) { OnImageSaveExceptionRaised?.Invoke(DateTime.Now, $"图片保存异常:{ex.GetExceptionMessage()}"); } }); } } }); } } public class ImageSaveSet { public string FullName { get; set; }//带后缀 全路径 public Bitmap SaveImage { get; set; } public ImageFormat ImageFormat { get; set; } = ImageFormat.Jpeg; } }