我用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>
的',因为它的动作中return'不退出过程中的第一个版本:它从动作的程序,然后继续返回流。 – stuartd