首页 > 其他分享 >.NET 处理类(批量任务队列,List分页处理,配置文件管理)

.NET 处理类(批量任务队列,List分页处理,配置文件管理)

时间:2022-09-07 11:34:42浏览次数:87  
标签:Index 配置文件 int List ts taskQueues NET public

   /// <summary>
    /// 任务队列接口
    /// </summary>
    public interface ITaskQueue<T>
    {
        /// <summary>
        /// 增加一个对象
        /// </summary>
        /// <param name="t"></param>
        void Add(T t);
        /// <summary>
        /// 获取一个分组队列
        /// </summary>
        /// <returns></returns>
        IList<T> GetQueue();
        /// <summary>
        /// 是否阻塞增加
        /// </summary>
        /// <returns></returns>
        bool IsWaitAdd();
        /// <summary>
        /// 当前队列完成
        /// </summary>
        void Complete();
    }
  /// <summary>
    /// 任务队列
    /// </summary>
    public class TaskQueue<T> : ITaskQueue<T>, IDisposable
    {
        /// <summary>
        /// 内置队列
        /// </summary>
        private ConcurrentDictionary<int, IList<T>> taskQueues;
        /// <summary>
        /// 分区大小
        /// </summary>
        private int PartitionSize;
        /// <summary>
        /// 默认index为0
        /// </summary>
        private int Index = 0;
        /// <summary>
        /// 默认处理偏移
        /// </summary>
        private int OffSet = 0;
        /// <summary>
        /// 内置锁
        /// </summary>
        private object Lock = new object();
        /// <summary>
        /// <summary>
        /// 构造
        /// </summary>
        /// <param name="PartitionSize">分区大小,默认分区大小为10 </param>
        public TaskQueue(int PartitionSize = 10)
        {
            taskQueues = new ConcurrentDictionary<int, IList<T>>();
            this.PartitionSize = PartitionSize;
            List<T> ts = new List<T>();
            taskQueues.AddOrUpdate(Index, ts, (k, v) => ts);
        }
        /// <summary>
        /// 增加一个对象
        /// </summary>
        /// <param name="t"></param>
        public void Add(T t)
        {
            lock (Lock)
            {
                IList<T> ts;
                if (taskQueues.TryGetValue(Index, out ts))
                {
                    if (ts.Count < PartitionSize)
                    {
                        ts.Add(t);
                        taskQueues.AddOrUpdate(Index, ts, (k, v) => ts);
                    }
                    else //超出区域范围,则新建区
                    {
                        Index++;
                        IList<T> ts1 = new List<T>();
                        ts1.Add(t);
                        taskQueues.AddOrUpdate(Index, ts1, (k, v) => ts1);
                    }
                }
                else
                {
                    IList<T> ts1 = new List<T>();
                    ts1.Add(t);
                    taskQueues.AddOrUpdate(Index, ts1, (k, v) => ts1);
                }
            }
        }
        /// <summary>
        /// 获取一个分组队列
        /// </summary>
        public IList<T> GetQueue()
        {
            lock (Lock)
            {
                IList<T> ts;
                if (taskQueues.TryGetValue(OffSet, out ts))
                {
                    if (OffSet == Index)//如果直接获取一个能用的,那就新建区为新区
                    {
                        Index++;
                    }
                    return ts;
                }
                return null;
            }
        }
        /// <summary>
        /// 是否阻塞增加
        /// </summary>
        public bool IsWaitAdd()
        {
            lock (Lock)
            {
                if (OffSet != Index)
                {
                    return true;
                }
                return false;
            }
        }
        /// <summary>
        /// 当前队列完成
        /// </summary>
        public void Complete()
        {
            lock (Lock)
            {
                IList<T> ts;
                taskQueues.TryRemove(OffSet, out ts);
                if (OffSet < Index)
                {
                    OffSet++;
                }
            }
        }

        public void Dispose()
        {
            if (taskQueues != null)
            {
                taskQueues.Clear();
                taskQueues = null;
            }
        }
    }
/// <summary>
    /// List分页处理
    /// </summary>
    public class ListPage<T>
    {
        /// <summary>
        /// 页数
        /// </summary>
        public int PageCount { get; set; }
        /// <summary>
        /// 当前页码
        /// </summary>
        public int CurrPage { get; set; }
        /// <summary>
        /// 一页多少条
        /// </summary>
        public int PageSize { get; set; }
        /// <summary>
        /// 数据源信息
        /// </summary>
        private List<T> DataSource { get; set; }
        /// <summary>
        /// 获取数据源和一页多少
        /// </summary>
        /// <param name="List"></param>
        /// <param name="PageSize"></param>
        public ListPage(List<T> List, int PageSize = 4, int CurrPage = 0)
        {
            DataSource = List;
            this.PageSize = PageSize;
            this.PageCount = (int)Math.Ceiling((decimal)DataSource.Count / PageSize);
            this.CurrPage = CurrPage;
 
        }
        //是否有下一页
        public bool HasNextPage
        {
            get { return CurrPage < this.PageCount; }
        }
        /// <summary>
        /// 直接获取下一页
        /// </summary>
        /// <returns></returns>
        public List<T> NextPage()
        {
            var data = DataSource.Skip((CurrPage) * PageSize).Take(PageSize).ToList();
            CurrPage++;
            return data;
        }
        /// <summary>
        /// 获取指定页
        /// </summary>
        /// <returns></returns>
        public List<T> getPage(int CurrPage)
        {
            var data = DataSource.Skip((CurrPage) * PageSize).Take(PageSize).ToList();
            return data;
        }
    } 
/// <summary>
    /// 配置信息(用来读取相应配置文件)
    /// </summary>
    public class ConfigInfo<T> where T : class, new()
    {
        /// <summary>
        /// 配置地址
        /// </summary>
        public string FileName { get; set; }
        /// <summary>
        /// 文件名
        /// </summary>
        public string FilePath { get; set; }
        /// <summary>
        /// 当前配置
        /// </summary>
        public T CurrentConfig { get; set; }
        /// <summary>
        /// 读写锁
        /// </summary>
        private ReaderWriterLockSlim rwl = new ReaderWriterLockSlim();
        /// <summary>
        /// 构造函数
        /// </summary>
        public ConfigInfo(string FileName)
        {
            this.FileName = FileName;
            this.FilePath = Path.Combine(AppDomain.CurrentDomain.BaseDirectory, FileName);
            CurrentConfig = Read();
        }
        /// <summary>
        /// 读取配置信息
        /// </summary>
        /// <returns></returns>
        public T Read()
        {
            T t = new T();
            if (File.Exists(FilePath))
            {
                try
                {
                    rwl.EnterReadLock();
                    var Str = File.ReadAllText(FilePath);
                    if (!string.IsNullOrEmpty(Str))
                    {
                        try
                        {
                            t = JsonConvert.DeserializeObject<T>(Str);
                            CurrentConfig = t;
                            return t;
                        }
                        catch (Exception)
                        { }
                    }
                }
                finally
                {
                    rwl.ExitReadLock();
                }
            }
            else
            {
                Save(t);
            }
            return t;
        }
        /// <summary>
        /// 写配置
        /// </summary>
        /// <param name="t"></param>
        public void Save(T t)
        {
            try
            {
                rwl.EnterWriteLock();
                if (!File.Exists(FilePath))
                {
                    try
                    {
                        Directory.CreateDirectory(new FileInfo(FilePath).DirectoryName);
                        CurrentConfig = t;
                    }
                    catch (Exception)
                    { }
                }
                File.WriteAllText(FilePath, JsonConvert.SerializeObject(t));
            }
            catch (Exception)
            {
            }
            finally
            {
                rwl.ExitWriteLock();
            }
        }
        /// <summary>
        /// 写配置
        /// </summary>
        /// <param name="t"></param>
        public void Save()
        {
            try
            {
                rwl.EnterWriteLock();
                if (!File.Exists(FilePath))
                {
                    try
                    {
                        Directory.CreateDirectory(new FileInfo(FilePath).DirectoryName);
                    }
                    catch (Exception)
                    { }
                }
                File.WriteAllText(FilePath, JsonConvert.SerializeObject(CurrentConfig));
            }
            catch (Exception)
            {
            }
            finally
            {
                rwl.ExitWriteLock();
            }
        }
    }

 

标签:Index,配置文件,int,List,ts,taskQueues,NET,public
From: https://www.cnblogs.com/YSAN718596403/p/16664759.html

相关文章

  • C# ASP.NET常见4种页面缓存方式
    C#ASP.NET常见4种页面缓存方式1、 分布式缓存Memcached教程pdf下载 2、内存缓存,此暂用服务器资源,没钱买好机机的少用,不用!#region内存缓存publicclas......
  • C#/.NET/.NET Core优秀项目框架推荐
    思维导航:前言Blog.CoreAspNetCoreWeiXinMPSDKABPFrameworkUtilsiteserver/cmsOSharpVue.NetCoreOpenAuth.Netant-design-blazorNetModularpaymentFurion......
  • 离线安装 .Net Framework 3.5
    .NetFramework3.5虽然已经年代久远,但一些老项目或老应用都对它有依赖。在线安装非常方便,通过添加删除程序或离线安装包都可以自动化完成,但有些项目中服务器没有外网环......
  • ASP.NET Core02应用启动和依赖注入
    应用启动使用Web模板创建的ASP.NETCore应用程序,应用程序启动代码位于Program.cs文件中。目前应用启动代码支持:RazorPagesMVCcontrollerswithviewsWebAPIw......
  • asp.net web api 如何设置允许后台跨域访问
    publicstaticclassWebApiConfig{publicstaticvoidRegister(HttpConfigurationconfig){//WebAPI配置和服务......
  • .NET 纯原生实现 Cron 定时任务执行,未依赖第三方组件 (Timer 优化版)
    在上个月写过一篇 .NET纯原生实现Cron定时任务执行,未依赖第三方组件的文章,当时 CronSchedule的实现是使用了,每个服务都独立进入到一个while循环中,进行定期扫描是......
  • leetcode 114. Flatten Binary Tree to Linked List 二叉树展开为链表(简单)
    一、题目大意给你二叉树的根结点root,请你将它展开为一个单链表:展开后的单链表应该同样使用TreeNode,其中right子指针指向链表中下一个结点,而左子指针始终为null。......
  • .net core 利用qq发送邮件
    1、进入qq邮箱首页,点击设置   2、点击 账户 选项卡,划到大概中间部分,有一个服务选项区。经实验开启前两个就可以了。 3、点击下方的 生成授权码,在开启服务之......
  • ASP.NET Core 01基础知识概述
    Program.cs使用Web模板创建的ASP.NETCore应用包含Program.cs文件中的应用程序启动代码。Program.cs文件中包含:已配置应用所需的服务。应用的请求处理管道定义......
  • Netty+WebSocket整合STOMP协议
    1.STOMP协议简介常用的WebSocket协议定义了两种传输信息类型:文本信息和二进制信息。类型虽然被确定,但是他们的传输体是没有规定的,也就是说传输体可以自定义成什么样的数据......