2016-12-15 7 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 правильно, так что если все повторные попытки фа il, я могу сделать исключение. Особенно в случае метода «void DoSomething».

Это, наверное, что-то глупое. Я спускаюсь.

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

    } 

 Смежные вопросы

  • Нет связанных вопросов^_^