2016-12-15 77 views
0

我用TransientFaultHandling.RetryPolicy做了一点概念验证。Microsoft.Practices.EnterpriseLibrary.TransientFaultHandling.RetryPolicy“return”object

在下面的代码中,我返回一个数据集。请注意“return returnDs;”代码位于ExecuteAction块内。

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); 
       return returnDs; 

     }); 

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

当代码运行时,returnDs被正确创建而没有错误,但是“return returnDs;”代码不会退出该过程。 InvalidOperationException仍然被执行/抛出。

...

以下代码可用作解决方法。

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"); 
    } 

......

但是,如果我有下面看到“无效”的方法,我没有什么检查空值。

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"); 
    } 

问题1: 为什么“回归returnDs;”代码不退出过程

问题2: 所以我的问题是,我怎么使用RetryPolicy正确的,因此,如果所有的重发我可以抛出异常。特别是在“void DoSomething”方法的情况下。

这可能是我忽略的一些愚蠢的东西。

仅供参考,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

的',因为它的动作中return'不退出过程中的第一个版本:它从动作的程序,然后继续返回流。 – stuartd

回答

0

我想通了。

我没有意识到ExecuteAction将根据其中的代码具有返回类型。

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; 
    } 

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; 
      } 
     }); 

    }