Stackoverflow 珠玑——封装重试指定次数的功能

最近写的一个 .NET Core 爬虫里用到了需要多次重试的功能,本着无脑输出的精神,google 了一下,还真给我找到了:

      public static T Retry<T, TException>(int timesToRetry, Func<int, T> thingToTry) where TException : Exception {
            // Start at 1 instead of 0 to allow for final attempt
            int i;
            for (i = 1; i < timesToRetry; i++) {
                try {
                    return thingToTry(i);
                }
                catch (TException) {
                    // Maybe: Trace.WriteLine("Failed attempt...");
                }
            }

            return thingToTry(i); // Final attempt, let exception bubble up
        }
     //这里我增加了个异步版本
        public static async Task<T> RetryAsync<T, TException>(int timesToRetry, Func<int, Task<T>> thingToTry) where TException : Exception {
            // Start at 1 instead of 0 to allow for final attempt
            int i;
            for (i = 1; i < timesToRetry; i++) {
                try {
                    return await thingToTry(i);
                }
                catch (TException) {
                    // Maybe: Trace.WriteLine("Failed attempt...");
                }
            }

            return await thingToTry(i); // Final attempt, let exception bubble up
        }

用法就很简单了:

using static AStaticClass;

class A {

    void B() {
        //重试 3 次
        var result = Retry<int, Exception>(3, nTimes => {
            //这里做需要重试的事情
            Console.WriteLine($"第 {nTimes} 次尝试");
            return 99999;
        });
    }
}

可惜当时看到的时候顺手关了浏览器,找不到原始出处了,等我找回来补上。

时间: 2024-10-20 03:42:49

Stackoverflow 珠玑——封装重试指定次数的功能的相关文章

封装ShareSDK中的分享功能封以及对类似第三方功能封装的心得【原创】

本篇的主题有三个: 1.封装思想的介绍 2.我的封装代码 3.我在封装sharesdk(采用的是简洁版本)分享功能是碰到的问题,以及解决方法. PS:其实这个我之前封装过一次,不过最近在重构项目时发现,当时封装的是如此的垃圾,所以在这里再来一次.欢迎大家批评纠错. 封装思想 因为这次封装的第三方SDK的功能,所以我采用延展的方式来进行封装.这样有以下两种好处: 1. 这样将第三方功能给模块化,在项目中方便查找和修改. 2. 很多第三方功能都是需要在appdelegae初始化,采用category

通过游戏学python 3.6 第一季 第九章 实例项目 猜数字游戏--核心代码--猜测次数--随机函数和屏蔽错误代码--优化代码及注释--简单账号密码登陆--账号的注册查询和密码的找回修改--锁定账号--锁定次数--菜单功能&#39;menufile

通过游戏学python 3.6 第一季 第九章 实例项目 猜数字游戏--核心代码--猜测次数--随机函数和屏蔽错误代码--优化代码及注释--简单账号密码登陆--账号的注册查询和密码的找回修改--锁定账号--锁定次数--菜单功能'menufile 1 #猜数字--核心代码--猜测次数--随机函数和屏蔽错误代码---优化代码及注释--简单账号密码登陆--账号的注册查询和密码的找回修改--锁定账号--锁定次数--菜单功能'menufile' 2 #!usr/bin/env python 3 #-*-c

JavaSE8基础 StringBuffer 将一个char字符重复指定次数后输出

os :windows7 x64    jdk:jdk-8u131-windows-x64    ide:Eclipse Oxygen Release (4.7.0) code: package jizuiku0; /* * @version V17.09 */ public class repeatCharDemo { public static void main(String[] args) { // 字符 0 重复输出3次 System.out.println(repeatChar('0

MySQL实现排名并查询指定用户排名功能,并列排名功能

MySQL实现排名并查询指定用户排名功能,并列排名功能 表结构: CREATE TABLE test.testsort ( id int(11) NOT NULL AUTO_INCREMENT, uid int(11) DEFAULT 0 COMMENT '用户id', score decimal(10, 2) DEFAULT 0.00 COMMENT '分数', PRIMARY KEY (id) ) ENGINE = INNODB AUTO_INCREMENT = 1 CHARACTER SE

继续封装jQuery框架的模块功能

在前两天已经封装了框架的选择器模块的函数了,在这里为了保持代码的完整性,以及体现框架模块的功能.这里用一个h5的方法,简单表示选择器模块. 1 (function(window){ //传入window全局对象,可以减少作用域的访问深度 2 //1.选择器模块 3 var select = (function () { 4 return function (selector, context) { 5 if (context) { 6 return context.querySelectorAl

为Typecho增加文章阅读次数统计功能

文章次数统计是比较常用的功能,插件一搜一堆,下面说说把这个功能集成到主题里的方法:把下面这段代码放到主题文件functions.php中 function Postviews($archive) { $db = Typecho_Db::get(); $cid = $archive->cid; if (!array_key_exists('views', $db->fetchRow($db->select()->from('table.contents')))) { $db->

swift涂鸦功能的实现包括截图,画板封装,文本编辑,分享功能,橡皮擦功能,马赛克技术

一伊涂鸦(swift)这是一款涂鸦软件,能够实现对图片的基本操作,供大家参考,主要功能点有: 1.截取长图 该功能的主要原理是截取webview的高度所在的区域,所以这种截屏需要在webview加载完毕后获取到webView.scrollView的contensize,然后将webview的高度设置成这个高度再结合上下文进行截屏操作,注意截屏之后webview的尺寸要恢复成之前的尺寸

366API可以实现微信跳转浏览器打开指定页面的功能

源码使用场景:1.用来实现微信自动跳转外部浏览器下载app2.用来实现微信内打开网页链接自动跳转浏览器访问指定页面3.防止网页链接由于被微信拦截,导致用户无法正常在微信内打开 源码说明: 适用安卓和苹果系统,支持任何网页链接.并且无论链接是否已经被微信拦截,均可实现微信内自动跳转浏览器打开. 生成的跳转链接具有极佳的防拦截效果. 源码体验: 1.复制分享链接(app下载页链接或网页链接),然后在浏览器(电脑和手机上都可以)中打开我们需要用到的366API 工具:http://www.366API

web页面实现指定区域打印功能

第一种方法:使用CSS,定义一个.noprint的class,将不打印的内容放入这个class内. 详细如下: <style media=print type="text/css"> .noprint{visibility:hidden} </style> 要打印的内容.哈哈! <p class="noprint">将不打印的代码放在这里.</p> <p >打印的代码放在这里.</p> <