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

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

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

【正版授权,激活自己账号】: Jetbrains全家桶Ide使用,1年售后保障,每天仅需1毛

【官方授权 正版激活】: 官方授权 正版激活 支持Jetbrains家族下所有IDE 使用个人JB账号...

(0)


相关推荐

  • python实现excel转json的例子[通俗易懂]

    python实现excel转json的例子[通俗易懂]python实现excel转json的例子(改进版)由于数值策划给出数值是excel表格,但前台flash程序用的又是json格式。服务器也用了json格式,而json又是utf-8编码的,用C++实现,太痛苦。鉴于此,尝试用python实现看看。没想到,python实现确实很简单,一个多小时搞定(有搜索事半功倍啊)。今天我又对它做了一点改进。主要1、是支持float和多表格;2、在exc…

  • vs2010密钥

    vs2010密钥vs2010密钥YCFHQ-9DWCY-DKV88-T2TMH-G7BHP转载于:https://www.cnblogs.com/andy_tigger/archive/2010/09/27/1837082.html

  • tree 命令安装

    tree 命令安装一、用yum安装tree命令yuminstall-ytree二、下载包安装下载安装包yuminstall-ywgetwgethttp://mama.indstate.edu/users/ice/tree/src/tree-1.8.0.tgztar-zxvftree-1.8.0.tgz-C/opt/softcdtree-1.8.0/yuminstall-ymakemakeinstall测试使用,命令:treemake:gcc:命令未找到make:**

  • MVC三层架构各层含义[通俗易懂]

    MVC三层架构各层含义[通俗易懂]1.模拟架构图:2.Action/Service/DAO简介:Action是管理业务(Service)调度和管理跳转的。Service是管理具体的功能的。Action只负责管理,而Service负责实施。DAO只完成增删改查,虽然可以1-n,n-n,1-1关联,模糊、动态、子查询都可以。但是无论多么复杂的查询,dao只是封装增删改查。至于增删查改如何去实现一个功能,dao是不管…

  • PAT乙级1004

    PAT乙级10041004.成绩排名(20)时间限制400ms内存限制65536kB代码长度限制8000B判题程序Standard作者CHEN,Yue读入n名学生的姓名、学号、成绩,分别输出成绩最高和成绩最低学生的姓名和学号。输入格式:每个测试输入包含1个测试用例,格式为第1行:正整数n第2行:第1个学生的姓名学号成绩第3行:第2个学生的姓名学号成绩…………

  • centos创建samba共享_centos设置samba

    centos创建samba共享_centos设置samba这篇指南介绍了如何在CentOS7中配置匿名和安全的Samba服务器。Samba是一个开源/自由软件套件,提供无缝的文件和打印服务SMB/CIFS客户端.Samba是免费的,不像其他的SMB/CIFS的实现着,Samba允许在Linux/Unix服务器和给予Windows的客户端之间

发表回复

您的电子邮箱地址不会被公开。

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