【发布时间】: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