C# 连接到Oracle DB时,异步等待引发Polly代码错误
下面是我试图使用Polly与Oracle数据库保持一致连接的代码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
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();
}
}
});
}
}