执行策略

执行策略的常见方式是调用策略的Execute函数

var policy = Policy.Handle<TimeoutException>().Retry();
policy.Execute(DoSomething);

返回值:

如果有返回值,它也是可以获取其返回值的:

var result = policy.Execute(DoSomething);

捕获异常:

如果在策略的执行过程中出现了异常,也会在该函数中同步抛出来,和直接执行该委托行为一致。可以直接通过try-catch处理。

try
{
    policy.Execute(DoSomething);
}
catch (Exception e)
{
    throw;
}

也可以通过ExecuteAndCapture函数捕获异常。

var result = policy.ExecuteAndCapture(DoSomething);
if (result.FaultType == null)
{
    Console.WriteLine(result.Result);
}

 

策略上下文

在策略的处理过程中,有一个上下文对象,可以在回调函数中使用:

public static RetryPolicy Retry(this PolicyBuilder policyBuilder, int retryCount, Action<Exception, int, Context> onRetry);

它是一个IDictionary<string, object>类型的对象,它在Policy的执行过程中都可以使用,如:

Policy.Handle<TimeoutException>().Retry(3, (err, countDown, context) =>
{
    var method = context["method"];
    ConsoleLogger.WriteLine(method);
})

这个上下文对象可以在应用策略的时候带入:

policy.Execute(DoSomething, new Context("context")
{
    ["method"] = "PolicyTest"
});

 

依赖注入

Polly也自带了一个简单的DI框架,方便复用Policy,使用方式如下:

var registry = new PolicyRegistry();
registry.Add("timeout & retry", Policy.Handle<TimeoutException>().Retry(3));

var policy = registry.Get<ISyncPolicy>("timeout & retry");
policy.Execute(DoSomething);

当然,也可以使用Autofac等自己喜欢的方式。

 

线程安全

Policy本身是线程安全的,可以并发使用同一个Policy,但如果Policy中执行的委托有多线程问题,仍然会出现异常。

 

异步的支持

Policy对异步操作也提供了良好的支持,只需要使用相应以Async结尾的函数即可。

var policy = Policy.Handle<TimeoutException>().RetryAsync(3);
await policy.ExecuteAsync(DoSomethingAsync);

PS:有的不需要(也没有)以Async的函数,如Handle

同步上下文

对于有的异常处理,如果需要同步上下文,则需要在ExecuteAsync函数中设置continueOnCapturedContext参数为false。

var policy = Policy.Handle<TimeoutException>().RetryAsync(3);
await policy.ExecuteAsync(DoSomethingAsync, CancellationToken.None, continueOnCapturedContext: true);

 

Cancellation的支持

Polly也支持系统的co-operative cancellation框架,在重试,超时,bulkhead等策略中通知执行的委托,从而影响其行为。要使用Cancellation,需要在Excute的时候传入CancellationToken。

policy.Execute(ct =>
{
    ct.ThrowIfCancellationRequested();
}, cts.Token);

具体示例在介绍弹性策略的超时策略时有介绍到。

 

 

Polly简介 — 3. 执行策略的更多相关文章

  1. Polly简介 — 2. 弹性策略

    和故障处理策略不同的是,弹性策略并不是针对委托执行过程中的异常进行处理,而是改变委托本身的行为,因此弹性策略并没有故障定义这一过程,它的处理流程为: 定义策略 应用策略 Polly对弹性策略也做了不少 ...

  2. Polly简介 — 1. 故障处理策略

    Polly 是 .Net 下的一套瞬时故障处理及恢复的函式库,可让开发者以fluent及线程安全的方式来应用诸如Retry.Circuit Breaker.Timeout.Bulkhead Isola ...

  3. Linux防火墙简介 – iptables配置策略

    Linux防火墙简介 – iptables配置策略 Netfilter/iptables简介 要想真正掌握Linux防火墙体系,首先要搞清楚Netfilter和iptables的关系,Netfilte ...

  4. 【EF 译文系列】重试执行策略的局限性(EF 版本至少为 6)

    原文链接:Limitations with Retrying Execution Strategies (EF6 onwards) 当使用重试执行策略的时候,大体有以下两种局限性: 不支持以流的方式进 ...

  5. 跟我一起读postgresql源码(六)——Executor(查询执行模块之——查询执行策略)

    时光荏苒,岁月如梭.楼主已经很久没有更新了.之前说好的一周一更的没有做到.实在是事出有因,没能静下心来好好看代码.当然这不能作为我不更新的理由,时间挤挤还是有的,拖了这么久,该再写点东西了,不然人就怠 ...

  6. PowerShell 脚本执行策略

    为防止恶意脚本的执行,PowerShell 中设计了一个叫做执行策略(Execution Policy)的东西(我更倾向于把它叫做脚本执行策略).我们可以在不同的应用场景中设置不同的策略来防止恶意脚本 ...

  7. TeamCity Build 步骤的执行策略

    TeamCity 会根据前一个 build 步骤的返回状态和当前的 build 状态来综合判断是否运行下一个 build 步骤.1 失败状态 当满足下面条件时 build 步骤的状态被确定为失败: b ...

  8. Entity Framework 6 暂停重试执行策略

    EF6引入一个弹性连接的功能,也就是允许重新尝试执行失败的数据库操作.某些复杂的场景中,可能需要启用或停用重试执行的策略,但是EF框架暂时尚未提供直接的设置开关,将来可能会加入这种配置.幸运的是,很容 ...

  9. PowerShell~执行策略的介绍

    首先看一下无法加载ps1脚本的解决方法 事实上也是由于策略导致的  解决方法主是开启对应的策略 set-ExecutionPolicy RemoteSigned 执行策略更改 执行策略可以防止您执行不 ...

随机推荐

  1. MongoDB 之 Limit 选取 Skip 跳过 Sort 排序 MongoDB - 7

    我们已经学过MongoDB的 find() 查询功能了,在关系型数据库中的选取(limit),排序(sort) MongoDB中同样有,而且使用起来更是简单 首先我们看下添加几条Document进来 ...

  2. bzoj 1432 数学(找规律)

    我们可以发现所有的情况(除n=1时),都可以找到两个交叉的直线,就是第一层的那 两个线段所在的直线如图中左 那么我们以这个为准,两边对称着加直线,会得到右图,每一层是折线,且每 加一对儿就多两条线段, ...

  3. 求矩形的周长(线段树+扫描线) Picture POJ - 1177

    题目链接:https://cn.vjudge.net/problem/POJ-1177 题目大意:求矩形外部的周长 具体思路:借用一下bin巨的一张图片. 我们按照y周从下往上的扫描线进行扫描,第一下 ...

  4. pip2和pip3冲突问题解决方法

    python使用pip安装模块时报错:unable to create process using ' '的解决方法: 参考:http://qoogle.cn/?id=39 1.删除C:\Python ...

  5. Spring面试问答25题

    1.什么是Spring框架?Spring框架有哪些主要模块? Spring框架是一个为Java应用程序的开发提供了综合.广泛的基础性支持的Java平台.Spring帮助开发者解决了开发中基础性的问题, ...

  6. Shell脚本实现非法IP登陆自动报警【转】

    服务器的安全稳定是每个运维都希望达到的目标,毕竟网站一旦流量大了,访问高了,就会有一些无聊人来攻击,帮忙检测漏洞是好,但纯ddos的性质就很恶劣了.说远了,这篇文章只是检测有非法ip登录到服务器上就自 ...

  7. android 通用 Intent

    通用 Intent 本文内容显示详细信息 闹钟 日历 相机 联系人/人员应用 电子邮件 文件存储 本地操作 地图 音乐或视频 新笔记 电话 搜索 设置 发送短信 网络浏览器 使用 Android 调试 ...

  8. JAVA 基础基本语法---常量与变量

    JAVA 基础基本语法---常量与变量 语法:计算机能够识别的语言的规则: 0. 基本语法 编写Java程序时,应注意以下几点: 大小写敏感:Java是大小写敏感的,这就意味着标识符Hello与hel ...

  9. 定制自己的new和delete:operator new 和 operator delete

    new和delete不同用法 基本用法 int * aptr = new int(10); delete aptr, aptr = nullptr; 上面的代码是我们最基本也是最常见的使用new和de ...

  10. php 批量导入昨天的数据(别类版的增量备份安案)

    $where = ''; $localogLogin = $this->gamedb_model->query_onerow("select `datetime` from lo ...