首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >Microsoft.Practices.EnterpriseLibrary.TransientFaultHandling.RetryPolicy“返回”对象

Microsoft.Practices.EnterpriseLibrary.TransientFaultHandling.RetryPolicy“返回”对象
EN

Stack Overflow用户
提问于 2016-12-15 23:31:53
回答 1查看 663关注 0票数 0

我正在用TransientFaultHandling.RetryPolicy做一个小的概念验证。

在下面的代码中,我将返回一个数据集。注意,"return return;“代码在ExecuteAction块中。

代码语言:javascript
复制
    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仍然会被执行/抛出。

..。

下面的代码是一种变通方法。

代码语言:javascript
复制
    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。

代码语言:javascript
复制
    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

代码语言:javascript
复制
<?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>
EN

回答 1

Stack Overflow用户

发布于 2016-12-16 02:13:45

我想通了。

我没有意识到ExecuteAction会有一个基于它内部代码的返回类型。

代码语言:javascript
复制
    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;
    }

代码语言:javascript
复制
    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;
            }
        });

    }
票数 0
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/41167833

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档