Je crée une stratégie de nouvelle tentative de la manière suivante:
var policy = Policy.Handle().WaitAndRetryAsync...
Comment chail / construire un délai d’attente pour la nouvelle stratégie ci-dessus? Policy.TimeoutAsync
retourne une TimeoutPolicy
, donc je ne peux pas faire quelque chose comme
var policy = Policy.TimeoutAsync(30).Handle().WaitAndRetryAsync...
Le délai d’expiration devient-il un paramètre commun à toutes mes stratégies de nouvelle tentative?
Pour combiner des stratégies, vous construisez chaque stratégie séparément, puis combinez-les à l’aide de PolicyWrap .
Pour créer un délai d’expiration global qui s’applique à toutes les tentatives dans son ensemble (c’est-à-dire à l’ensemble de l’opération):
var overallTimeoutPolicy = Policy.TimeoutAsync(60); var waitAndRetryPolicy = Policy .Handle() .WaitAndRetryAsync(/* your wait-and-retry specification*/); var combinedPolicy = overallTimeoutPolicy.WrapAsync(waitAndRetryPolicy); await combinedPolicy.ExecuteAsync(cancellationToken => ...)
Pour imposer un délai d’expiration à chaque essai, regroupez les stratégies de nouvelle tentative et de délai d’expiration dans l’autre ordre:
var timeoutPerTry = Policy.TimeoutAsync(10); var waitAndRetryPolicy = Policy .Handle() .WaitAndRetryAsync(/* your wait-and-retry specification*/); var combinedPolicy = waitAndRetryPolicy.WrapAsync(timeoutPerTry); await combinedPolicy.ExecuteAsync(cancellationToken => ...);
Ou même utiliser les deux types de délai d’expiration (par tentative, par opération globale):
var overallTimeout = Policy.TimeoutAsync(60); var timeoutPerTry = Policy.TimeoutAsync(10); var waitAndRetryPolicy = Policy .Handle() .WaitAndRetryAsync(/* your wait-and-retry specification*/); var combinedPolicy = Policy .WrapAsync(overallTimeout, waitAndRetryPolicy, timeoutPerTry); // demonstrates alternative PolicyWrap syntax await combinedPolicy.ExecuteAsync(cancellationToken => ...);
Le wiki PolicyWrap fournit des détails complets sur la syntaxe et des conseils sur les effets des différents ordres lors de la combinaison de stratégies dans un même conteneur .
Répondre:
Le délai d’expiration devient-il un paramètre commun à toutes mes stratégies de nouvelle tentative?
Les stratégies s’appliquent partout où vous les utilisez (qu’elles soient utilisées individuellement ou dans le cadre d’un PolicyWrap
).
Vous pouvez utiliser en toute sécurité toute instance de TimeoutPolicy
vous avez configurée sur plusieurs sites d’appels. Par conséquent, pour appliquer ce délai d’expiration en tant que paramètre commun à toutes vos stratégies de nouvelle tentative, incluez simplement la même instance TimeoutPolicy
dans PolicyWrap
pour chaque site d’appels. TimeoutPolicy
instance unique TimeoutPolicy
peut être TimeoutPolicy
toute sécurité avec différentes instances de stratégie de nouvelle tentative.
Si vos spécifications d’attente et de nouvelle tentative et de délai d’expiration sont communes à tous les sites d’appels, créez simplement une instance PolicyWrap
englobant les deux (conformément aux exemples de code ci-dessus) et réutilisez cette instance PolicyWrap
partout. Encore une fois – thread safe.