如何使用 Rx 定期执行代码直到第一次成功执行?
How to execute code periodically until first successful execution using Rx?
我想重复执行一些代码:
- 代码应执行到第一次成功调用(不抛出异常)或调用次数未达到某个 N;
- 每个下一次调用(失败后)应该在延迟 T 后执行;
- 每次执行的结果应由订阅处理(包括异常);
- 可以通过某种方式取消执行(例如使用 CancellationToken)。
实际上我计划使用该代码执行对某些服务器的调用,有时可能会关闭几秒钟。
我是 Rx 的新手,在问这个问题之前尝试了一些方法(花大约 2 个小时阅读文档和编写代码)并决定,我需要一些例子。
我想要这样的东西(不是工作代码,只是原型):
Observalbe.Create(
() => {
// TODO: some code here (it can throw exceptions)...
}
).Retry(N)
.Delay(T)
.Subscribe(
result => { Log.Info("The result is {0}", result); },
error => { Log.Error(error, "Error occured"); }
)
我知道,Rx 很神奇,但我应该使用什么样的魔法才能达到预期的效果?
你最好使用类似 Polly 的东西,它允许你简洁地指定异常处理策略。
var policy = Policy.Handle<Exception>()
// Retry 5 times waiting 1 second in between
.WaitAndRetry(5, x => TimeSpan.FromSeconds(1), (e,d,c) =>
{
Console.WriteLine("Count = {0}, Message = {1}", c.Count, e.Message);
});
policy.Execute(() =>
{
throw new Exception("Error!");
});
我想重复执行一些代码:
- 代码应执行到第一次成功调用(不抛出异常)或调用次数未达到某个 N;
- 每个下一次调用(失败后)应该在延迟 T 后执行;
- 每次执行的结果应由订阅处理(包括异常);
- 可以通过某种方式取消执行(例如使用 CancellationToken)。
实际上我计划使用该代码执行对某些服务器的调用,有时可能会关闭几秒钟。
我是 Rx 的新手,在问这个问题之前尝试了一些方法(花大约 2 个小时阅读文档和编写代码)并决定,我需要一些例子。
我想要这样的东西(不是工作代码,只是原型):
Observalbe.Create(
() => {
// TODO: some code here (it can throw exceptions)...
}
).Retry(N)
.Delay(T)
.Subscribe(
result => { Log.Info("The result is {0}", result); },
error => { Log.Error(error, "Error occured"); }
)
我知道,Rx 很神奇,但我应该使用什么样的魔法才能达到预期的效果?
你最好使用类似 Polly 的东西,它允许你简洁地指定异常处理策略。
var policy = Policy.Handle<Exception>()
// Retry 5 times waiting 1 second in between
.WaitAndRetry(5, x => TimeSpan.FromSeconds(1), (e,d,c) =>
{
Console.WriteLine("Count = {0}, Message = {1}", c.Count, e.Message);
});
policy.Execute(() =>
{
throw new Exception("Error!");
});