C# 从Polly basics开始

C# 从Polly basics开始,c#,transient,polly,retry-logic,resiliency,C#,Transient,Polly,Retry Logic,Resiliency,我对波利很陌生,我正试图从最基本的开始理解它是如何工作的 为了测试重试,我尝试创建一个代码(Print),它有33%的空间生成dividebyzero异常。当生成错误时,它将上升到策略。执行似乎不由Polly管理 有人能帮我调整这个代码吗?我正在使用.NETFramework4.7.2 using System; using Polly; class Program { static void Main(string[] args) { var policy =

我对波利很陌生,我正试图从最基本的开始理解它是如何工作的

为了测试重试,我尝试创建一个代码(Print),它有33%的空间生成dividebyzero异常。当生成错误时,它将上升到策略。执行似乎不由Polly管理

有人能帮我调整这个代码吗?我正在使用.NETFramework4.7.2

using System;
using Polly;

class Program
{
    static void Main(string[] args)
    {
        var policy = Policy
                        .Handle<DivideByZeroException>()
                        .Retry();

        policy.Execute(() => Print());
        Console.ReadKey();
    }

    private static void Print()
    {
        var rand = new Random();
        int a = rand.Next(1000, 2000);
        int b = rand.Next(0, 2);
        Console.WriteLine("a = {0} - b {1}", a, b);
        int c = a / b;
        Console.WriteLine("c = {0}", c);
    }
}
使用系统;
使用Polly;
班级计划
{
静态void Main(字符串[]参数)
{
var策略=策略
.Handle()
.重试();
policy.Execute(()=>Print());
Console.ReadKey();
}
私有静态void Print()
{
var rand=new Random();
int a=兰特下一步(10002000);
int b=下一个随机数(0,2);
WriteLine(“a={0}-b{1}”,a,b);
INTC=a/b;
WriteLine(“c={0}”,c);
}
}

如果您设置了
b
=
0
,而不是使用
Random
,您将看到它正在处理异常,但它不会永远重试-您将看到它在失败之前打印输出两次。因此,这意味着,在使用
Random
的情况下,有时会连续多次将
b
设置为
0
,在这种情况下,策略会耗尽重试次数,因此抛出

您可以使用
Retry(n)
将策略配置为增加重试次数。或者,您可以使用
RetryForever()

如果您不希望调用代码在重试次数用尽时抛出,可以改用捕获结果:

var result = policy.ExecuteAndCapture(() => Print());
if (result.Outcome == OutcomeType.Failure)
{
    // result.FinalException contains the exception
}

如果设置
b
=
0
,而不是使用
Random
,您将看到它正在处理异常,但不会永远重试-您将看到它在失败之前打印输出两次。因此,这意味着,在使用
Random
的情况下,有时会连续多次将
b
设置为
0
,在这种情况下,策略会耗尽重试次数,因此抛出

您可以使用
Retry(n)
将策略配置为增加重试次数。或者,您可以使用
RetryForever()

如果您不希望调用代码在重试次数用尽时抛出,可以改用捕获结果:

var result = policy.ExecuteAndCapture(() => Print());
if (result.Outcome == OutcomeType.Failure)
{
    // result.FinalException contains the exception
}

你能举例说明你所看到的和你期望看到的吗?请注意,由于您使用的是
Random
,因此实际可能不会发生异常。请尝试将
Random
作为单个静态变量创建一次,而不是每次运行
Print
时都创建一个新的
Random
。能否添加一个示例,说明您看到的内容与预期看到的内容?请注意,因为您使用的是
Random
,所以异常可能不会实际发生。请尝试将
Random
作为单个静态变量创建一次,而不是每次运行
打印时都创建一个新的
Random
。感谢您的回复…with.Retry(1)似乎可以工作…我想象.Retry()与Retry(1)类似但似乎我错了。@user1812102
Retry()
Retry(1)
相同。您是否设置了
b=0
?如果没有,你只是在用
Random
来决定它是否有效。也许我在出错后查看输出时感到困惑,无论如何现在看起来很清楚了…谢谢你的回复…使用.Retry(1)似乎有效…我想象.Retry()类似于Retry(1),但似乎我错了。@user1812102
Retry()
重试(1)
相同。您是否设置了
b=0
?如果没有,你只是在用
Random
来决定它是否有效。也许我在出错后查看输出时感到困惑,反正现在看起来很清楚了。。。