如何在使用Rx首次成功执行之前定期执行代码?

时间:2015-08-24 09:42:50

标签: c# system.reactive

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

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

1 个答案:

答案 0 :(得分:3)

使用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!");
});