如何定期执行代码,直到第一次使用Rx成功执行

本文关键字:执行 Rx 第一次 成功 何定期 代码 | 更新日期: 2023-09-27 18:09:24

我想以重复的方式执行一些代码:

  • 代码应该执行,直到第一次成功调用(而不是抛出异常)或调用计数未达到某个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是魔法,但我应该用什么样的魔法来达到预期的结果?

如何定期执行代码,直到第一次使用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!");
});