【问题标题】:async await throwing error for Polly code while connecting to Oracle DB连接到 Oracle DB 时,异步等待 Polly 代码抛出错误
【发布时间】:2021-04-28 20:54:50
【问题描述】:

下面是我尝试使用 Polly 与 Oracle 数据库保持一致连接的代码。

public async Task<bool> Execute()
{
    var retryTimes = 3000;
    var waitBetweenExceptions = TimeSpan.FromSeconds(10);

    var retryPolicy = await Policy
        .Handle<OracleException>(e => e.Message.Contains("ORA-12543") || e.Message.Contains("ORA-12170"))
        .WaitAndRetry(retryTimes, i => waitBetweenExceptions);

    retryPolicy.Execute(() =>
    {
        string cs = "Data Source=SampleDB;User Id=userid;Password=password;Connection Timeout=600; Max Pool Size=150;";
        using (OracleConnection connection = new OracleConnection(cs))
        {
            for (int i = 0; i < 1000; i++)
            {
                connection.Open();
                Console.WriteLine("Counter :" + i);
                Thread.Sleep(1000);
                connection.Close();
            }
        }
    });
    return true;
}

我收到Cannot await void 编译错误的错误。另外,我想试试 Polly 的 WaitForever 方法。

我尝试了类似以下问题的方法,但对如何成功使用它有点困惑。

Getting a Cannot await void, on a method that I have want to await on

编辑 同步方式的修改题

我尝试了下面的代码,但它仍然无法正常工作......

class Program
{
    static void Main(string[] args)
    {
        Connect connect = new Connect();
        connect.Execute();
        Console.ReadKey();
    }
}

public class Connect
{
    public void Execute()
    {
        var retryTimes = 3000;
        var retryableErrorCodes = new[] { "ORA-12543", "ORA-12170" };
        RetryPolicy retryPolicy = Policy
            .Handle<OracleException>(ex => retryableErrorCodes.Any(errorCode => ex.Message.Contains(errorCode)))
            .WaitAndRetry(retryTimes, _ => TimeSpan.FromSeconds(10));

        retryPolicy.Execute(() =>
        {
            string cs = "Data Source=SampleDB;User Id=userid;Password=password;Connection Timeout=600; Max Pool Size=150;";
            using (OracleConnection connection = new OracleConnection(cs))
            {
                for (int i = 0; i < 1000; i++)
                {
                    connection.Open();
                    Console.WriteLine("Counter :" + i);
                    Thread.Sleep(1000);
                    connection.Close();
                }
            }
        });
    }
}

我尝试使用同步方式。但是,断开网线后,它只是静默停止,但不会自动重新连接。

【问题讨论】:

  • GitHub 中给出的Polly-Samples 中,他们使用通过HTTP 协议的连接。但在这里我需要连接到 Oracle 数据库。
  • 我也可以使用相同的功能,但可以使用 bool 或任何其他相关数据类型解析、异步和等待。
  • 能否请您详细说明一下仍然无法正常工作...?什么是预期的行为,什么是观察到的?
  • 首先计数器每秒递增一次,此时,如果我断开程序和 Oracle DB 之间的电缆,计数器将停止并且不再重试以连接到数据库。
  • 是的,它现在工作正常。它从它离开的地方继续。我的代码的问题是我使用的是Console.ReadKey()。所以,它没有继续。非常感谢。

标签: c# async-await polly


【解决方案1】:

要修饰的代码是syncasync

同步案例

政策声明

var retryableErrorCodes = new[] { "ORA-12543", "ORA-12170" };
RetryPolicy retryPolicy = Policy
    .Handle<OracleException>(ex => retryableErrorCodes.Any(errorCode => ex.Message.Contains(errorCode)))
    .WaitAndRetry(retryTimes, _ => TimeSpan.FromSeconds(10));

政策使用

retryPolicy.Execute(() => 
{
  //...
});

异步案例

政策声明

var retryableErrorCodes = new[] { "ORA-12543", "ORA-12170" };
AsyncRetryPolicy retryPolicy = Policy
    .Handle<OracleException>(ex => retryableErrorCodes.Any(errorCode => ex.Message.Contains(errorCode)))
    .WaitAndRetryAsync(retryTimes, _ => TimeSpan.FromSeconds(10));

政策使用

await retryPolicy.ExecuteAsync((ct) =>
{
  //...
}, CancellationToken.None);

WaitAndRetryForeverWaitAndRetryForeverAsync 相同,但您不必指定最大重试次数。

【讨论】:

  • 我仍然卡在某个地方。编辑了问题。请纠正我哪里出错了。
  • @Ch.您要修饰的代码不是异步的,因此您应该使用同步版本。请使用同步版本修改您的问题,之后我会尽力帮助您。
  • 修改问题为同步方式。
猜你喜欢
  • 2018-12-20
  • 2013-08-31
  • 1970-01-01
  • 2021-04-24
  • 1970-01-01
  • 1970-01-01
  • 2020-03-16
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多