我正在用TransientFaultHandling.RetryPolicy做一个小的概念验证。
在下面的代码中,我将返回一个数据集。注意,"return return;“代码在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");
}当代码运行时,return被正确创建,没有错误,但是"return return;“代码不会退出该过程。而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");
}.
但是,如果我有一个“void”方法,如下所示,我没有任何东西需要检查null。
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:为什么"return return;“代码不退出该过程?
问题2:所以我的问题是,如何正确使用RetryPolicy,以便如果所有重试都失败,我可以抛出异常。特别是在“空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>发布于 2016-12-16 02:13:45
我想通了。
我没有意识到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;
}
});
}https://stackoverflow.com/questions/41167833
复制相似问题