C# 波莉:笨重的政策与RetryPolicy相结合

C# 波莉:笨重的政策与RetryPolicy相结合,c#,polly,C#,Polly,我有一个C#API,它可以与web服务进行通信,如果web服务太忙,就会抛出异常。我想限制此WCF服务的并行调用数 由于web服务太忙时会快速抛出异常,因此我希望将隔板与重试结合使用,并且我明确希望首先应用隔板以限制重试策略中等待的呼叫数。PolicyWrap的文档说它通常应该是另一种方式,但在我的情况下,我需要这样做 然而,它不起作用。我正在运行一个包含40个并发调用的性能测试,它会同时重试所有40个调用 这是政策定义: var retryPolicy = Policy.HandleResul

我有一个C#API,它可以与web服务进行通信,如果web服务太忙,就会抛出异常。我想限制此WCF服务的并行调用数

由于web服务太忙时会快速抛出异常,因此我希望将隔板与重试结合使用,并且我明确希望首先应用隔板以限制重试策略中等待的呼叫数。PolicyWrap的文档说它通常应该是另一种方式,但在我的情况下,我需要这样做

然而,它不起作用。我正在运行一个包含40个并发调用的性能测试,它会同时重试所有40个调用

这是政策定义:

var retryPolicy = Policy.HandleResult<wcfResponse>(r => !r.IsSuccessStatus())
  .Or<TimeoutException>()
  .Or<CommunicationException>()
  .WaitAndRetryAsync(60, i => TimeSpan.FromSeconds(1),

// setting maxParallel to 1 and a large queue, 
// so I only expect one call to be retrying at the same time. 
// However, it is doing all 40 calls in parallel, 
// the bulkhead seems to be ignored and the retry policy 
// kicks in for all requests in parallel.

var bulkHeadPolicy = Policy.BulkheadAsync(1, 100);
return bulkHeadPolicy.WrapAsync(retryPolicy);
var retryPolicy=Policy.HandleResult(r=>!r.issusccessstatus())
.或()
.或()
.WaitAndRetryAsync(60,i=>TimeSpan.FromSeconds(1),
//将maxParallel设置为1和一个大队列,
//因此,我只希望一个电话在同一时间重试。
//然而,它正在同时进行所有40次通话,
//隔板似乎被忽略,重试策略
//并行处理所有请求。
var bulkHeadPolicy=Policy.BulkheadAsync(1100);
return bulkHeadPolicy.WrapAsync(retryPolicy);

我在这里遗漏了什么?

我发现了问题所在。我为每个请求创建了一个新的隔离策略,这是错误的。我已将其更改为只创建一次,这很有效

再次阅读后发现,具体如下:

范围限定实例

BulkheadPolicy的一个实例维护编号的内部状态 通过隔板执行的操作:必须重复使用相同的 BulkheadPolicy实例通过调用站点执行,而不是 在每次遍历代码时创建一个新实例


您可以添加到问题中,通过策略进行的呼叫的代码吗?另外,提供导致意外同时进行呼叫的注释的示例代码也很有用。我同时发现了问题所在:我每次都为每个请求创建了一个新的隔离策略。。。