使用连接到重试策略的特定超时
Use a specific timeout connected to a retrypolicy
我正在通过以下方式创建重试策略:
var policy = Policy.Handle<Exception>().WaitAndRetryAsync...
如何chail/build 上面的重试策略超时? Policy.TimeoutAsync
returns 一个 TimeoutPolicy
,因此我无法做类似
的事情
var policy = Policy.TimeoutAsync(30).Handle<Exception>().WaitAndRetryAsync...
.
超时是否成为我所有重试策略的通用设置?
要组合策略,您可以分别构建每个策略,然后使用 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 => ...);
或者甚至使用两种超时(每次尝试,每次整体操作):
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 gives full syntax details, and advice on the effects of different orderings, when combining policies within a wrap.
回答:
Does the timeout become a common setting for all my retry policies?
政策适用于您使用它们的任何地方(无论是单独使用,还是作为 PolicyWrap
的一部分使用)。
您可以 thread-safely 使用您在多个调用站点配置的任何 TimeoutPolicy
实例。因此,要将该超时作为所有重试策略的通用设置应用,只需在每个调用站点的 PolicyWrap
中包含相同的 TimeoutPolicy
实例。如果需要,可以使用 不同的 重试策略实例安全地包装单个 TimeoutPolicy
实例。
如果您的等待重试规范和超时规范对于所有调用站点都是通用的,只需创建一个包含两者的 PolicyWrap
实例(根据上述代码示例),然后重新使用该 PolicyWrap
实例无处不在。再次 - 线程安全。
我正在通过以下方式创建重试策略:
var policy = Policy.Handle<Exception>().WaitAndRetryAsync...
如何chail/build 上面的重试策略超时? Policy.TimeoutAsync
returns 一个 TimeoutPolicy
,因此我无法做类似
var policy = Policy.TimeoutAsync(30).Handle<Exception>().WaitAndRetryAsync...
.
超时是否成为我所有重试策略的通用设置?
要组合策略,您可以分别构建每个策略,然后使用 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 => ...);
或者甚至使用两种超时(每次尝试,每次整体操作):
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 gives full syntax details, and advice on the effects of different orderings, when combining policies within a wrap.
回答:
Does the timeout become a common setting for all my retry policies?
政策适用于您使用它们的任何地方(无论是单独使用,还是作为 PolicyWrap
的一部分使用)。
您可以 thread-safely 使用您在多个调用站点配置的任何 TimeoutPolicy
实例。因此,要将该超时作为所有重试策略的通用设置应用,只需在每个调用站点的 PolicyWrap
中包含相同的 TimeoutPolicy
实例。如果需要,可以使用 不同的 重试策略实例安全地包装单个 TimeoutPolicy
实例。
如果您的等待重试规范和超时规范对于所有调用站点都是通用的,只需创建一个包含两者的 PolicyWrap
实例(根据上述代码示例),然后重新使用该 PolicyWrap
实例无处不在。再次 - 线程安全。