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

How to execute code periodically until first successful execution using Rx?

我想重复执行一些代码:

实际上我计划使用该代码执行对某些服务器的调用,有时可能会关闭几秒钟。

我是 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!");
});