Я делаю небольшое доказательство концепции с 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>
Первая версия 'return' не выходит из процедуры, потому что это в действии: она возвращает поток от действия к процедуре, которая затем продолжается. – stuartd