Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/csharp/300.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
C# 连接到Oracle DB时,异步等待引发Polly代码错误_C#_Async Await_Polly - Fatal编程技术网

C# 连接到Oracle DB时,异步等待引发Polly代码错误

C# 连接到Oracle DB时,异步等待引发Polly代码错误,c#,async-await,polly,C#,Async Await,Polly,下面是我试图使用Polly与Oracle数据库保持一致连接的代码 public async Task<bool> Execute() { var retryTimes = 3000; var waitBetweenExceptions = TimeSpan.FromSeconds(10); var retryPolicy = await Policy .Handle<OracleException>(e => e.Messa

下面是我试图使用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;
}

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

要修饰的代码是
sync
async

同步案例 政策声明
var retryableErrorCodes=new[]{“ORA-12543”、“ORA-12170”};
RetryPolicy RetryPolicy=Policy
.Handle(ex=>retryableErrorCodes.Any(errorCode=>ex.Message.Contains(errorCode)))
.WaitAndRetry(retryTimes,=>TimeSpan.FromSeconds(10));
策略使用
retryPolicy.Execute(()=>
{
//...
});
异步情况 政策声明
var retryableErrorCodes=new[]{“ORA-12543”、“ORA-12170”};
AsyncRetryPolicy retryPolicy=策略
.Handle(ex=>retryableErrorCodes.Any(errorCode=>ex.Message.Contains(errorCode)))
.waitandretyasync(retryTimes,=>TimeSpan.FromSeconds(10));
策略使用
wait retryPolicy.ExecuteAsync((ct)=>
{
//...
},CancellationToken.None);


WaitAndRetryForever
WaitAndRetryForeverAsync
将是相同的,但您不必在其中指定最大重试次数。

GitHub
中给出的
Polly示例中,它们通过HTTP协议使用连接。但在这里我需要连接到Oracle数据库。我也可以使用相同的函数,但要解析、异步和等待bool或任何其他相关数据类型。请您详细说明一下,它仍然不起作用。。。?预期的行为是什么,观察到的结果是什么?首先,计数器每秒递增一次,此时,如果我断开程序和Oracle DB之间的电缆,计数器将停止,不再重试连接到数据库。是的,现在工作正常。它从它离开的地方继续。我的代码的问题是我使用的是
Console.ReadKey()
。因此,它不会继续下去。非常感谢。我还是被困在某个地方。编辑了这个问题。请纠正我的错误。@Ch.您要修饰的代码不是异步的,所以您应该使用同步版本。请用同步版本修改你的问题,然后我会尽力帮助你。修改问题的同步方式。
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();
                }
            }
        });
    }
}