LoopBox 用于包装循环的盒子

LoopBox 用于包装循环的盒子LoopBox 用于包装循环的盒子

大家好,又见面了,我是你们的朋友全栈君。

/*******************************************************
 * 
 * 作者:朱皖苏
 * 创建日期:20180608
 * 说明:此文件只包含一个类,具体内容见类型注释。
 * 版本号:1.0.0
 * 
 * 历史记录:
 * 创建文件 朱皖苏 20180608 16:06
 * 
*******************************************************/

using System;
using System.Diagnostics;
using System.Threading;

namespace Dben.CommonLib.LoopBox
{

    /// <summary>
    /// 封装了重复执行一段程序 n 次,它会额外输出每次处理耗时及计划完成时间。
    /// 继承此类以实现一个可配置的批处理数据程序。
    /// </summary>
    public abstract class LoopBox
    {
        /// <summary>
        /// 构造函数写入 <see cref="Context"/> 实例
        /// </summary>
        public LoopBox()
        {
            Context = InitContext();
        }

        /// <summary>
        /// 循环中的上下文对象
        /// </summary>
        protected ILoopContext Context { get; private set; }

        /// <summary>
        /// 循环执行任务。 box 的启动程序。
        /// </summary>
        /// <param name="loopBoxConfig"></param>
        public void Loop(LoopBoxConfig loopBoxConfig)
        {
            var log = $"处理计划:计划数据:{ loopBoxConfig.PlanTotal} 条,每次处理 {loopBoxConfig.LoopBatch} 条,共计处理 {loopBoxConfig.LoopCount}次";
            LogOutput(log);
            Context.Config = loopBoxConfig;
            var swItem = new Stopwatch();
            var swTotal = new Stopwatch();
            swTotal.Start();
            for (int i = 1; i <= loopBoxConfig.LoopCount; i++)
            {
                Context.Index = i;
                try
                {
                    swItem.Start();
                    Do();
                    swItem.Stop();
                    LogOutput($"第{i}/{loopBoxConfig.LoopCount}批执行完毕,执行耗时 {swItem.Elapsed.TotalSeconds} 秒,总耗时 {swTotal.Elapsed.TotalSeconds} 秒。预计剩余时间 {(loopBoxConfig.LoopCount - i == 0 ? 0 : swTotal.Elapsed.TotalSeconds / i * (loopBoxConfig.LoopCount - i))} 秒。 ");
                }
                catch (Exception e)
                {
                    LogOutput($"第{i}/{loopBoxConfig.LoopCount}批执行出现异常:{e.Message + e.StackTrace}");
                    throw e;
                }
                finally
                {
                    swItem.Reset();
                }
            }
            swTotal.Stop();
        }

        /// <summary>
        /// 初始化上下文对象,
        /// 需要提供一个简单的接口数据 <see cref="ILoopContext"/>/// 以确定执行 <see cref="Do"/> 的次数和输出执行的相关信息。
        /// 推荐使用默认 <see cref="DefaultLoopContext{T}"/>
        /// </summary>
        /// <returns></returns>
        protected abstract ILoopContext InitContext();

        /// <summary>
        /// 此函数为迭代中要执行的方法,
        /// <para>
        /// 相关的参数、结果的数据传递请使用自定义上下文或者继承<see cref="ILoopContext"/>,
        /// </para>
        /// 一般场景推荐使用默认的上下文对象<see cref="DefaultLoopContext{T}"/>
        /// </summary>
        protected abstract void Do();

        /// <summary>
        /// 此函数为 box 出口。实现此函数以及时响应程序执行过程和进度。
        /// </summary>
        /// <param name="log"></param>
        protected abstract void LogOutput(string log);
    }
}

/*******************************************************
 * 
 * 作者:朱皖苏
 * 创建日期:20180608
 * 说明:此文件只包含一个类,具体内容见类型注释。
 * 版本号:1.0.0
 * 
 * 历史记录:
 * 创建文件 朱皖苏 20180608 16:06
 * 
*******************************************************/

using System;
using System.Linq;

namespace Dben.CommonLib.LoopBox
{
    public class LoopBoxConfig
    {
        public LoopBoxConfig(long planTotal = 0, long loopBatch = 0, long loopCount = 0)
        {
            var items = new long[3] { planTotal, loopBatch, loopCount };

            if (items.Count(m => m < 1) >= 2)
            {
                throw new Exception("You can't have two or three attribute values that are less than zero at the same time.");
            }
            PlanTotal = planTotal;
            LoopBatch = loopBatch;
            LoopCount = loopCount;
        }

        private long loopCount;
        private long loopBatch;
        private long planTotal;
        public long LoopCount
        {
            get
            {
                if (loopCount < 1)
                {
                    loopCount = (long)Math.Ceiling((decimal)PlanTotal / LoopBatch);
                }
                return loopCount;
            }
            private set { loopCount = value; }
        }

        public long LoopBatch
        {
            get
            {
                if (loopBatch < 1)
                {
                    loopBatch = (long)Math.Ceiling((decimal)PlanTotal / LoopCount);
                }
                return loopBatch;
            }
            private set
            {
                loopBatch = value;
            }
        }

        public long PlanTotal
        {
            get
            {
                if (planTotal < 1)
                {
                    planTotal = LoopCount * LoopBatch;
                }
                return planTotal;
            }
            private set
            {
                planTotal = value;
            }
        }

    }
}

/*******************************************************
 * 
 * 作者:朱皖苏
 * 创建日期:20180608
 * 说明:此文件只包含一个类,具体内容见类型注释。
 * 版本号:1.0.0
 * 
 * 历史记录:
 * 创建文件 朱皖苏 20180608 16:06
 * 
*******************************************************/

namespace Dben.CommonLib.LoopBox
{
    public interface ILoopContext
    {
        LoopBoxConfig Config { get; set; }
        int Index { get; set; }
    }
}

/*******************************************************
 * 
 * 作者:朱皖苏
 * 创建日期:20180608
 * 说明:此文件只包含一个类,具体内容见类型注释。
 * 版本号:1.0.0
 * 
 * 历史记录:
 * 创建文件 朱皖苏 20180608 16:07
 * 
*******************************************************/

using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;
using System.Threading.Tasks;

namespace Dben.CommonLib.LoopBox
{
    /// <summary>
    /// 默认的上下文对象
    /// </summary>
    /// <typeparam name="T"></typeparam>
    public sealed class DefaultLoopContext<T> : ILoopContext
    {
        public T Tag { get; set; }
        public LoopBoxConfig Config { get; set; }
        public int Index { get; set; }
    }
}

 

转载于:https://www.cnblogs.com/zhuwansu/p/10836926.html

版权声明:本文内容由互联网用户自发贡献,该文观点仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请联系我们举报,一经查实,本站将立刻删除。

发布者:全栈程序员-站长,转载请注明出处:https://javaforall.net/106827.html原文链接:https://javaforall.net

(0)
上一篇 2022年4月22日 上午8:00
下一篇 2022年4月22日 上午8:00


相关推荐

  • Spring batch批量处理框架最佳实践

    Spring batch批量处理框架最佳实践springbatch精选,一文吃透springbatch批量处理框架前言碎语批处理是企业级业务系统不可或缺的一部分,springbatch是一个轻量级的综合性批处理框架,可用于开发企业信息系统中那些至关重要的数据批量处理业务.SpringBatch基于POJO和Spring框架,相当容易上手使用,让开发者很容易地访问和利用企业级服务.springbatch具有高可扩展性的框架…

    2022年5月23日
    37
  • 如何在WinForm中发送HTTP请求

    如何在WinForm中请求发送HTTP手工发送HTTP请求主要是调用System.Net的HttpWebResponse方法手工发送HTTP的GET请求:手工发送HTTP的POST请求转自:

    2021年12月26日
    46
  • 局域网 广域网 网际网络[通俗易懂]

    局域网 广域网 网际网络[通俗易懂]网络的分类

    2022年10月19日
    9
  • jrtplib使用笔记[通俗易懂]

    一、简述RTP是目前解决流媒体实时传输问题的最好办法,而JRTPLIB是一个用C++语言实现的RTP库,包括UDP通讯。刚使用JRTPLIB,对JRTPLIB的理解还不够深,当做使用时,积累的一些经验写个笔记吧。二、RTP协议实时传送协议(Real-timeTransportProtocol或简写RTP,也可以写成RTTP)是一个网络传输协议,RTP协议详细说明了在互联

    2022年4月6日
    131
  • OpenClaw必装Skill全指南

    OpenClaw必装Skill全指南

    2026年3月13日
    3
  • Maven 生成打包可执行jar包

    Maven 生成打包可执行jar包文章目录1.需求2.开发环境3.Maven打包插件介绍4.Maven使用maven-jar-plugin打可执行jar包5.Maven使用maven-assembly-plugin装需要打包的文件打进zip包6.Maven生成可执行jar包及zip项目压缩包7.执行jar包8.pom.xml配置9.package.xml文件最近IDEA打可执行Jar包搞了三天,一直失败,好好学…

    2022年5月30日
    33

发表回复

您的邮箱地址不会被公开。 必填项已用 * 标注

关注全栈程序员社区公众号