2016-12-15 2 views
0

Je fais une petite démonstration de concept avec TransientFaultHandling.RetryPolicy.Microsoft.Practices.EnterpriseLibrary.TransientFaultHandling.RetryPolicy "retour" objet

Dans le code ci-dessous, je renvoie un jeu de données. Notez le "return returnDs"; le code est à l'intérieur du bloc ExecuteAction. Lorsque le code s'exécute, le returnDs est créé correctement sans erreurs, mais le "return returnDs;" le code ne quitte pas la procédure. Et InvalidOperationException est toujours exécuté/levé.

...

Le code ci-dessous fonctionne comme un travail autour.

public DataSet GetADataSet() 
    { 
     DataSet returnDs = null; 

     RetryStrategy retryStrat = new Incremental(3, TimeSpan.FromMilliseconds(500), TimeSpan.FromSeconds(1)); 
     RetryPolicy retryPol = new RetryPolicy<SqlDatabaseTransientErrorDetectionStrategy>(retryStrat); 

     retryPol.ExecuteAction(() => 
     { 

       DatabaseProviderFactory factory = new DatabaseProviderFactory(); 
       Database db = factory.CreateDefault(); 
       DbCommand dbc = db.GetStoredProcCommand("dbo.uspGetSomeStuff"); 
       returnDs = db.ExecuteDataSet(dbc); 

     }); 

     if (null != returnDs) 
     { 
      return returnDs; 
     } 

     throw new InvalidOperationException("RetryPolicy let us down"); 
    } 

......

Cependant, si j'ai une méthode « vide » comme on le voit ci-dessous, je n'ai rien à vérifier nulle pour.

public void DoSomething() 
    { 
     DataSet returnDs = null; 

     RetryStrategy retryStrat = new Incremental(3, TimeSpan.FromMilliseconds(500), TimeSpan.FromSeconds(1)); 
     RetryPolicy retryPol = new RetryPolicy<SqlDatabaseTransientErrorDetectionStrategy>(retryStrat); 

     retryPol.ExecuteAction(() => 
     { 

       DatabaseProviderFactory factory = new DatabaseProviderFactory(); 
       Database db = factory.CreateDefault(); 
       DbCommand dbc = db.GetStoredProcCommand("dbo.uspDoSomething"); 
       db.ExecuteNonQuery(dbc); 

     }); 

     throw new InvalidOperationException("RetryPolicy let us down"); 
    } 

Question 1: Pourquoi le « retour returnDs, » le code ne quitte pas la procédure

question 2: donc, ma question est, comment puis-je utiliser correctement RetryPolicy, de sorte que si tous les Retries fa Je peux lancer une exception. Surtout dans le cas de la méthode "DoSomething".

C'est probablement quelque chose de stupide que je néglige.

Pour votre information, packages.config

<?xml version="1.0" encoding="utf-8"?> 
<packages> 
    <package id="CommonServiceLocator" version="1.0" targetFramework="net40" /> 
    <package id="EnterpriseLibrary.Common" version="6.0.1304.0" targetFramework="net45" /> 
    <package id="EnterpriseLibrary.Data" version="6.0.1304.0" targetFramework="net45" /> 
    <package id="EnterpriseLibrary.TransientFaultHandling" version="6.0.1304.0" targetFramework="net45" /> 
    <package id="EnterpriseLibrary.TransientFaultHandling.Data" version="6.0.1304.1" targetFramework="net45" /> 
    <package id="Unity" version="2.1.505.0" targetFramework="net40" /> 
    <package id="Unity.Interception" version="2.1.505.0" targetFramework="net40" /> 
</packages> 
+0

La première version de 'return' ne quitte pas la procédure, car il est dans l'action: elle renvoie le flux de l'action à la procédure, qui se poursuit ensuite. – stuartd

Répondre

0

I figured it out.

Je ne savais pas que ExecuteAction aura un type de retour basé sur le code qu'il contient.

public DataSet GetADataSet() 
    { 
     DataSet returnDs = null; 

     var retryStrategy = new Incremental(3, TimeSpan.FromMilliseconds(500), TimeSpan.FromSeconds(1)); 
     var retryPolicy = new RetryPolicy<SqlDatabaseTransientErrorDetectionStrategy>(retryStrategy); 

     returnDs = retryPolicy.ExecuteAction(() => 
     { 
      try 
      { 
       DatabaseProviderFactory factory = new DatabaseProviderFactory(); 
       Database db = factory.CreateDefault(); 
       DbCommand dbc = db.GetStoredProcCommand("dbo.uspGetSomeStuff"); 

       DataSet ds; 
       ds = db.ExecuteDataSet(dbc); 
       return ds; 
      } 
      catch (Exception ex) 
      { 
       throw ex; 
      } 
     }); 

     return returnDs; 
    } 

et

public void DoSomething() 
    { 
     RetryStrategy retryStrat = new Incremental(3, TimeSpan.FromMilliseconds(500), TimeSpan.FromSeconds(1)); 
     RetryPolicy retryPol = new RetryPolicy<SqlDatabaseTransientErrorDetectionStrategy>(retryStrat); 

     int myValue = retryPol.ExecuteAction(() => 
     { 
      try 
      { 
       DatabaseProviderFactory factory = new DatabaseProviderFactory(); 
       Database db = factory.CreateDefault(); 
       DbCommand dbc = db.GetStoredProcCommand("dbo.uspDoSomething"); 
       return db.ExecuteNonQuery(dbc); /* because this returns an int, ExecuteAction return will also be an int */ 
      } 
      catch (Exception ex) 
      { 
       throw ex; 
      } 
     }); 

    }