2010-07-07 4 views
0

J'utilise une bibliothèque d'automatisation externe avec un ensemble d'API avec 1 ou 2 paramètres qui lancent de façon aléatoire TargetInvocationException. L'appel de ces API deuxième ou troisième fois fonctionne généralement. J'ai donc créé deux méthodes d'aide pour encapsuler multiples logiques de nouvelle tentativePassage d'un appel de méthode et de son paramètre à une méthode différente

//Original API calls 
bool result1 = Foo1(true); 
int result2 = Foo2(4, "abc"); 

//New API calls 
bool result1 = SafeMethodCall(Foo1, true); 
int result2 = SafeMethodCall(Foo2, 4, "abc"); 


//Helper Methods 
public static TResult SafeMethodCall<T, TResult>(
    Func<T, TResult> unSafeMethod, 
    T parameter) 
{ 
    int numberOfMethodInvocationAttempts = 3; 
    int sleepIntervalBetweenMethodInvocations = 10000; 

    for (int i = 0; i < numberOfMethodInvocationAttempts; i++) 
    { 
     try 
     { 
      return unSafeMethod(parameter); 
     } 
     catch (System.Reflection.TargetInvocationException ex) 
     { 
      System.Threading.Thread.Sleep(sleepIntervalBetweenMethodInvocations); 
     } 
    } 
} 

public static TResult SafeTargetInvocationMethodCall<T1, T2, TResult>(
    Func<T1, T2, TResult> unSafeMethod, 
    T1 parameter1, 
    T2 parameter2) 
{ 
    int numberOfMethodInvocationAttempts = 3; 
    int sleepIntervalBetweenMethodInvocations = 10000; 

    for (int i = 0; i < numberOfMethodInvocationAttempts; i++) 
    { 
     try 
     { 
      return unSafeMethod(parameter1, parameter2); 
     } 
     catch (System.Reflection.TargetInvocationException ex) 
     { 
      System.Threading.Thread.Sleep(sleepIntervalBetweenMethodInvocations); 
     } 
    } 
} 

Problème: Si vous voyez les deux méthodes d'assistance ont au-dessus du même corps et la seule différence est appel unsafeMethod à l'intérieur du bloc try. Comment puis-je éviter la duplication de code ici que je pourrais avoir à ajouter une méthode surchargée qui accepte

Func<TResult> 

comme un autre type de paramètre.

Répondre

1

Il suffit de passer en Func<TResult> et appellent comme ceci:

bool result1 = SafeMethodCall(() => Foo1(true)); 
int result2 = SafeMethodCall(() => Foo2(4, "abc")); 

En d'autres termes, les arguments encapsulent dans le délégué lui-même.

+0

Merci qui a très bien fonctionné! Je suis toujours en train d'essayer d'envelopper ma tête autour des délégués. Pouvez-vous suggérer des livres ou des liens qui ont plus d'informations sur l'utilisation pratique des lambdas et des délégués plutôt que sur la théorie? Quelque chose qui couvre des situations similaires à mon problème? – Snak3byte

+0

@Anunay: Je ne crains pas, vraiment ... mon propre livre (C# en profondeur) parle beaucoup de délégués, mais pas de ce genre de situation en particulier. –

Questions connexes