使用连接到retrypolicy的特定超时

Joh*_*han 4 c# polly

我正在通过以下方式创建重试策略:

var policy = Policy.Handle<Exception>().WaitAndRetryAsync...

如何为上面的retrypolicy进行chail/build超时?Policy.TimeoutAsync返回a TimeoutPolicy,因此我无法做出类似的事情

var policy = Policy.TimeoutAsync(30).Handle<Exception>().WaitAndRetryAsync....

超时是否成为我所有重试策略的常用设置?

mou*_*ler 7

要组合策略,请分别构建每个策略,然后使用PolicyWrap将它们组合在一起.

构建整体超时,适用于整个重试(即整个操作):

var overallTimeoutPolicy = Policy.TimeoutAsync(60); 
var waitAndRetryPolicy = Policy
    .Handle<WhateverException>()
    .WaitAndRetryAsync(/* your wait-and-retry specification*/);
var combinedPolicy = overallTimeoutPolicy.WrapAsync(waitAndRetryPolicy);

await combinedPolicy.ExecuteAsync(cancellationToken => ...)
Run Code Online (Sandbox Code Playgroud)

要对每个特定尝试施加超时,请按其他顺序包装重试和超时策略:

var timeoutPerTry = Policy.TimeoutAsync(10); 
var waitAndRetryPolicy = Policy
    .Handle<WhateverException>()
    .WaitAndRetryAsync(/* your wait-and-retry specification*/);
var combinedPolicy = waitAndRetryPolicy.WrapAsync(timeoutPerTry);

await combinedPolicy.ExecuteAsync(cancellationToken => ...);
Run Code Online (Sandbox Code Playgroud)

甚至可以使用两种超时(per-try,per-overall-operation):

var overallTimeout = Policy.TimeoutAsync(60); 
var timeoutPerTry = Policy.TimeoutAsync(10); 
var waitAndRetryPolicy = Policy
    .Handle<WhateverException>()
    .WaitAndRetryAsync(/* your wait-and-retry specification*/);

var combinedPolicy = Policy
    .WrapAsync(overallTimeout, waitAndRetryPolicy, timeoutPerTry); // demonstrates alternative PolicyWrap syntax

await combinedPolicy.ExecuteAsync(cancellationToken => ...);
Run Code Online (Sandbox Code Playgroud)

PolicyWrap维基给出完整的语法细节,并在不同的排序的影响的意见,一个包装内结合政策时.


回答:

超时是否成为我所有重试策略的常用设置?

政策适用于您使用它们的任何地方(无论是单独使用还是作为a的一部分使用PolicyWrap).

您可以线程安全地使用TimeoutPolicy您在多个呼叫站点配置的任何实例.因此,要将该超时应用为所有重试策略的通用设置,只需TimeoutPolicyPolicyWrap每个调用站点中包含相同的实例即可.如果需要,TimeoutPolicy可以使用不同的重试策略实例安全地包装单个实例.

如果等待和重试规范以及超时规范对于所有呼叫站点都是通用的,那么只需创建一个PolicyWrap包含两者的实例(按照上面的代码示例),并PolicyWrap在任何地方重用该实例.再次 - 线程安全.