Чтобы объединить политики, вы создаете каждую политику отдельно, а затем объединяете их с помощью 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 предоставляет полную информацию о синтаксисе, а совет о влиянии различных порядков при объединении политик в оболочке.
Отвечать:
Стало ли тайм-аут обычным параметром для всех моих политик повтора?
Политики применяются везде, где вы их используете (независимо от того, используются ли они по отдельности или как часть PolicyWrap
).
Вы можете потокобезопасно использовать любой TimeoutPolicy
экземпляр вы настроили на нескольких сайтах вызова. Итак, чтобы применить этот тайм-аут как общий параметр для всех ваших политик повтора, просто включите тот же экземпляр TimeoutPolicy
в PolicyWrap
для каждого сайта вызова. При желании единственный экземпляр TimeoutPolicy
можно безопасно обернуть разными экземплярами политики повтора.
Если и ваша спецификация ожидания и повтора, и спецификация тайм-аута являются общими для всех сайтов вызова, просто создайте один PolicyWrap
экземпляр, охватывающий оба (согласно приведенным выше примерам кода), и повторно используйте этот PolicyWrap
экземпляр везде. Опять же - потокобезопасный.
person
mountain traveller
schedule
04.04.2017