我正在通过以下方式创建重试策略:
var policy = Policy.Handle<Exception>().WaitAndRetryAsync...
如何为上面的retrypolicy进行chail / build超时? Policy.TimeoutAsync
会返回TimeoutPolicy
,因此我无法执行类似
var policy = Policy.TimeoutAsync(30).Handle<Exception>().WaitAndRetryAsync...
。
超时是否成为我所有重试政策的常用设置?
答案 0 :(得分: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 => ...)
要对每个特定尝试施加超时,请按其他顺序包装重试和超时策略:
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 => ...);
甚至可以使用两种超时(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 => ...);
PolicyWrap wiki提供了完整的语法详细信息,以及advice on the effects of different orderings, when combining policies within a wrap。
回答:
超时是否成为我所有重试政策的常用设置?
政策适用于您使用它们的任何地方(无论是单独使用还是作为PolicyWrap
的一部分使用)。
您可以thread-safely使用您在多个呼叫站点配置的任何TimeoutPolicy
实例。因此,要将该超时应用为所有重试策略的通用设置,只需在每个呼叫站点的TimeoutPolicy
中包含相同的PolicyWrap
实例即可。如果需要,可以使用不同的重试策略实例安全地包装单个TimeoutPolicy
实例。
如果等待重试规范和超时规范对于所有呼叫站点都是通用的,只需创建一个包含两个PolicyWrap
实例的实例(按照上面的代码示例),然后重用{{1实例无处不在。再次 - 线程安全。