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)
全栈程序员-站长的头像全栈程序员-站长


相关推荐

  • Java html转word_html文件转换成excel

    Java html转word_html文件转换成excel使用aspose的原因:1.使用简单,功能强大2.可以自动将html中可以访问的img标签存入word文档中3.可以轻松实现HTML中的样式转换到word文档中首先使用的jar包是:aspose-words-14.9.0-jdk16.jar这个可以在网上找到激活成功教程版以下是代码:1:读取asposelicensepublicstaticbooleangetAsposeWordLice

    2022年10月10日
    5
  • postman设置环境变量,实现一套接口根据选择的环境去请求不同的url[通俗易懂]

    postman设置环境变量,实现一套接口根据选择的环境去请求不同的url

    2022年2月8日
    47
  • 推荐系统 算法(开源推荐系统算法)

    来源:https://blog.csdn.net/eouaq448466/article/details/54772890推荐算法具有非常多的应用场景和商业价值,因此对推荐算法值得好好研究。推荐算法种类很多,但是目前应用最广泛的应该是协同过滤类别的推荐算法,本文就对协同过滤类别的推荐算法做一个概括总结,后续也会对一些典型的协同过滤推荐算法做原理总结。1.推荐算法概述    推荐算法是…

    2022年4月11日
    112
  • python信号处理库_python开源协议

    python信号处理库_python开源协议本发明涉及的是一种在用电采集终端上实现标准MBUS协议接口用来采集水表、热量表、气表数据的方法,具体涉及一种基于MBUS标准协议接口模块采集水、热、气表的方法,属于用电信息采集领域。背景技术:我国正处于自动化楼宇建设事业蓬勃发展的时期,远程抄表系统作为其中重要的一环,正朝着自动化及智能化方向发展;MBUS(仪表总线)总线作为一种通讯方式,以其高性价比,在水热测量仪表中得到了广泛的应用,大大推动了远…

    2022年10月15日
    2
  • 进程的用户态和内核态的概念理解以及切换方法_用户进程从用户态切换到内核态

    进程的用户态和内核态的概念理解以及切换方法_用户进程从用户态切换到内核态原文链接:https://www.cnblogs.com/viviwind/archive/2012/09/22/2698450.html内核态:当一个任务(进程)执行系统调用而陷入内核代码中执行时,我们就称进程处于内核运行态。此时处理器处于特权级最高的(0级)内核代码中执行。当进程处于内核态时,执行的内核代码会使用当前进程的内核栈。用户态:每个进程都有自己的内核栈。当进程在执行用…

    2025年11月30日
    5
  • rtsp 获取视频流 java_Java获取rtsp视频流,实现rtsp流预览功能,并将视频流每帧保存成图片…

    rtsp 获取视频流 java_Java获取rtsp视频流,实现rtsp流预览功能,并将视频流每帧保存成图片…先展示maven依赖吧,就一个javacvorg.bytedecojavacv-platform1.5.1pom然后就是测试类publicstaticvoidtestzc()throwsFrameGrabber.Exception{Stringrtsp=”获取的对应rtsp流”;FFmpegFrameGrabbergrabber=FFmpegFrameGrabber.crea…

    2022年10月9日
    3

发表回复

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

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