简体   繁体   English

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

[英]Microsoft.Practices.EnterpriseLibrary.TransientFaultHandling.RetryPolicy “return” object

I'm doing a little Proof of Concept with TransientFaultHandling.RetryPolicy. 我正在使用TransientFaultHandling.RetryPolicy做一些概念验证。

In the below code, I'm returning a dataset. 在下面的代码中,我将返回一个数据集。 Note the "return returnDs;" 注意“ return returnDs;” code is inside the ExecuteAction block. 代码位于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");
    }

When the code runs, the returnDs is created correctly with no errors, but the "return returnDs;" 代码运行时,可以正确创建returnDs,而不会出现错误,但是会创建“ return returnDs;”。 code does not exit the procedure. 代码不会退出该过程。 And InvalidOperationException still gets executed/thrown. 并且InvalidOperationException仍然被执行/抛出。

... ...

The below code works as a work around. 下面的代码可以变通。

    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");
    }

...... ......

However, if I have a "void' method as seen below, I don't have anything to check null for. 但是,如果我有一个如下所示的“ 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");
    }

Question 1: Why does the "return returnDs;" 问题1:为什么要“返回returnDs”; code not exit the procedure? 代码不退出程序?

Question 2: So my question is, how do I use RetryPolicy correctly, so that if all the retries fail, I can throw an exception. 问题2:我的问题是,如何正确使用RetryPolicy,这样,如果所有重试均失败,则可以引发异常。 Especially in the case of "void DoSomething" method. 特别是在“ void DoSomething”方法的情况下。

It's probably something stupid I'm overlooking. 我可能忽略了这件事。

FYI, packages.config 仅供参考,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>

I figured it out. 我想到了。

I didn't realize ExecuteAction will have a return type based on the code within it. 我没有意识到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;
    }

and

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

    }

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

相关问题 如何从Microsoft.Practices.EnterpriseLibrary.TransientFaultHandling中的RetryPolicy.ExecuteAction调整值 - How to retun value from RetryPolicy.ExecuteAction in Microsoft.Practices.EnterpriseLibrary.TransientFaultHandling Microsoft.Practices.TransientFaultHandling.RetryPolicy的正确代码是什么? - Whats the correct code for Microsoft.Practices.TransientFaultHandling.RetryPolicy? EnterpriseLibrary 6错误:无法访问已处置的对象(对象名称:&#39;Microsoft.Practices.EnterpriseLibrary.Logging.LogWriter&#39;) - EnterpriseLibrary 6 error: Cannot access a disposed object (Object name: 'Microsoft.Practices.EnterpriseLibrary.Logging.LogWriter') Microsoft.Practices.EnterpriseLibrary.* 的替代品 - Alternatives to Microsoft.Practices.EnterpriseLibrary.* 什么是 Microsoft.Practices.EnterpriseLibrary.Data - what is Microsoft.Practices.EnterpriseLibrary.Data Microsoft.Practices.EnterpriseLibrary.Data CreateDatabase 错误 - Microsoft.Practices.EnterpriseLibrary.Data CreateDatabase error EntLib TransientFaultHandling RetryPolicy.ExecuteAsync同步上下文 - EntLib TransientFaultHandling RetryPolicy.ExecuteAsync synchronization context 如何使用Microsoft.Practices.EnterpriseLibrary将业务对象数组传递到SQL Server数据库 - How to pass Business Object Array into SQL server database using Microsoft.Practices.EnterpriseLibrary 无法加载文件或程序集Microsoft.Practices.EnterpriseLibrary.Configuration - Could not load file or assembly Microsoft.Practices.EnterpriseLibrary.Configuration C#Microsoft.Practices.EnterpriseLibrary.Logging错误 - C# Microsoft.Practices.EnterpriseLibrary.Logging error
 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM