Façon la plus propre d'écrire logique de nouvelle tentative?

Temps en temps j'ai un besoin de relancer une opération plusieurs fois avant d'abandonner. Mon code est comme:

int retries = 3;
while(true) {
  try {
    DoSomething();
    break; //success!
  } catch {
    if(--retries == 0) throw;
    else Thread.Sleep(1000);
  }
}

Je voudrais réécrire ce dans un général de réessayer de fonction comme:

TryThreeTimes(DoSomething);

Est-il possible en C#? Quel serait le code pour le TryThreeTimes() méthode?

  • Un cycle simple n'est pas suffisant? Pourquoi ne pas parcourir et exécuter la logique à plusieurs reprises?
  • Personnellement, je serais extrêmement méfier d'une telle méthode d'assistance. Il est certainement possible de mettre en œuvre à l'aide de lambda, mais le modèle lui-même est extrêmement puant, de sorte que l'introduction d'une aide pour elle (ce qui implique qu'il est souvent répété) est en elle-même très suspect, et fortement allusion à la mauvaise conception globale.
  • Dans mon cas, mon DoSomething()s sont en train de faire des trucs sur des machines distantes, telles que la suppression des fichiers, ou essayer de frapper un port réseau. Dans les deux cas, il existe d'importants problèmes de synchronisation lorsque DoSomething réussissent, et en raison de l'éloignement, il n'y a aucun cas je peux écouter. Alors oui, ses odeurs. Suggestions de bienvenue.
  • pourquoi l'aide de nouvelles tentatives allusion à la mauvaise conception globale? Si vous écrivez beaucoup de code qui relie les points d'intégration puis à l'aide de tentatives est certainement un motif que vous devriez sérieusement envisager d'utiliser.
InformationsquelleAutor noctonura | 2009-10-13