Utiliser un délai d’expiration spécifique connecté à une stratégie de nouvelle tentative

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.