您的位置:首页 > 教程 > ASP.NET > .Net弹性和瞬态故障处理库Polly实现执行策略

.Net弹性和瞬态故障处理库Polly实现执行策略

2022-06-29 17:57:50 来源:易采站长站 作者:

.Net弹性和瞬态故障处理库Polly实现执行策略

执行策略

执行策略的常见方式是调用策略的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>

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

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

到此这篇关于Polly实现执行策略的文章就介绍到这了。希望对大家的学习有所帮助,也希望大家多多支持易采站长站。

如有侵权,请联系QQ:279390809 电话:15144810328

相关文章

  • [Asp.Net Core] 浅谈Blazor Server Side

    [Asp.Net Core] 浅谈Blazor Server Side

    在2016年, 本人就开始了一个内部项目, 其特点就是用C#构建DOM树, 然后把DOM同步到浏览器中显示. 并且在一些小工程中使用. 3年下来, 效果很不错, 但因为是使用C#来构建控件树, 在没有特定
    2020-07-01
  • asp.net生成Excel并导出下载五种实现方法

    asp.net生成Excel并导出下载五种实现方法

    方法一 通过GridView(简评:方法比较简单,但是只适合生成格式简单的Excel,且无法保留VBA代码),页面无刷新 aspx.cs部分 代码如下: using System; using System.Collections; using System.Configuration; usi
    2019-05-16
  • Asp.Net Core用NLog记录日志操作方法

    Asp.Net Core用NLog记录日志操作方法

    需求 1.日志自动写入到数据库、写入到文件 2.appsettings.json数据库连接更改后,不需要去改NLog中的连接地址,启动网站或项目时自动检测变动然后去更改,以appsettings.json为准,保持同步
    2019-11-19
  • 使用vs2019加.net core 对WeiApi的创建过程详解

    使用vs2019加.net core 对WeiApi的创建过程详解

    vs2019创建webapi 1.创建新的项目 2.选择.NET CORE的ASP .NET CORE WEB应用程序 3.定义项目名称和存放地点 4.选择API创建项目 5.删除原本的无用的类 6.添加新的方法类 7.设置路由 using Microsoft.AspNe
    2020-07-03
  • 教你Asp.net下使用mysql数据库的步骤

    教你Asp.net下使用mysql数据库的步骤

    1. 首先需要安装mysql, 易采站长站下载地址: //www.jb51.net/softs/2193.html 或者去mysql.com官网都可以,一路next,安装好后,有个简单配置,提示有个设置登录密码和服务名称, 默认localhost,用
    2019-05-16
  • [Asp.Net Core]用Blazor Server Side实现图片验证码

    [Asp.Net Core]用Blazor Server Side实现图片验证码

    关于Blazor 由于在国内, Blazor一点都不普及, 在阅读此文前, 建议读者先翻看我之前写的随笔, 了解Blazor Server Side的特点. 在一段时间内, 我会写一些解说分析型的 "为什么选择 Blazor Server
    2020-07-01
  • 详解ASP.NET Razor 语法

    详解ASP.NET Razor 语法

    Razor 同时支持 C# (C sharp) 和 VB (Visual Basic)。 主要的 Razor C# 语法规则 Razor 代码块包含在 @{ ... } 中 内联表达式(变量和函数)以 @ 开头 代码语句用分号结束 变量使用 var 关键字声明 字符
    2020-07-07
  • .Net Core中使用ExceptionFilter过滤器的方法

    .Net Core中使用ExceptionFilter过滤器的方法

    .Net Core中有各种Filter,分别是AuthorizationFilter、ResourceFilter、ExceptionFilter、ActionFilter、ResultFilter。可以把他们看作是.Net Core自带的AOP的扩展封装。 今天来看其中的一种:ExceptionFilter(用于
    2020-03-03