J'écris une application web, donc la concurrence est concernée. Je dois appeler une API avec un jeton expiré toutes les 10 minutes, donc avant chaque appel d'API, je dois vérifier les nouveaux jetons.Est-ce que le verrouillage entre deux mêmes instructions conditionnelles est bon?
Je n'ai aucune expérience avec la conception simultanée, donc c'est ce que je fais et j'ai besoin de quelqu'un pour clarifier si je me porte bien. Est-ce anti-pattern? Note: la classe elle-même est singleton.
private object tokenLock = new object();
private void RequestApi()
{
if (DateTime.UtcNow >= this.TokenExpireTime)
{
lock (this.tokenLock)
{
if (DateTime.UtcNow >= this.TokenExpireTime)
{
// Request new Token
// Update new Token Expiration Time
}
}
}
// Request API
}
Pour empêcher le code dupliquée, je peux réécrire dans une propriété (la logique est toujours la même):
private void RequestApi()
{
if (this.NeedNewToken)
{
lock (this.tokenLock)
{
if (this.NeedNewToken)
{
// Request new Token
// Update new Token Expiration Time
}
}
}
// Request API
}
private bool NeedNewToken => DateTime.UtcNow >= this.TokenExpireTime;
Cela appartient plus à CodeReview qu'à StackOverflow – derape
En fait, je pense que je devrais même faire une fonction, appelons-la "EnsureToken()", qui encapsule ce modèle. Si le modèle lui-même est une mauvaise pratique est un autre problème, cependant. Je crains que cela ne soit fermé car "principalement orienté". – Fildor
Vous avez correctement validé deux fois avec un verrou intermédiaire. L'utilisation d'une propriété ou non est basée sur l'opinion. Mais assurez-vous également de verrouiller le processus d'écriture à 'TokenExpireTime'. Sinon, vous pourriez finir par lire 'TokenExpireTime' en écrivant dessus. Le résultat serait inconnu dans ce cas. –