使用Rx Start,Retry,Delay,等待同步文件删除重试

Ale*_*hov 1 c# system.reactive

我需要删除一个文件和应用程序中的其他一些进程阻止它.作为一种解决方法,我决定间隔几次尝试.这是正确的方法:

Observable.Start(() => File.Delete(path)).Retry(2)
    .Delay(TimeSpan.FromMilliseconds(500)).Wait();
Run Code Online (Sandbox Code Playgroud)

Jam*_*rld 7

这不会按照你想要的方式工作.有三个问题:

  • 延迟不会影响您的想法 - 它会延迟传递事件,但源仍然会立即运行.
  • 你发的是Retry之前的Delay
  • 您需要使用Defer创建工厂,因为Start在评估时只会调用嵌入式函数一次.

看看这个答案有关更多细节Delay以及为什么DelaySubscription更好:Rx退出并重试.

这个答案很好地实现了退避重试:写一个Rx"RetryAfter"扩展方法

对你的代码的一个简单修复就是这个,它可以捕获异常并在延迟后重新抛出它 - 但是如果有效则没有延迟:

Observable.Defer(() => Observable.Start(() => File.Delete(path)))
   .Catch((Exception ex) =>
      Observable.Throw<Unit>(ex)
      .DelaySubscription(TimeSpan.FromMilliseconds(500)))
   .Retry(2)
   .Wait();
Run Code Online (Sandbox Code Playgroud)

请查看上面的第二个链接,以获得更全面,更好的实现.

我保持上面的代码简单,以说明问题并不完美 - 它总是延迟例外.

你真的想拥有DelaySubscription动作,并根据重试次数动态计算延迟时间,这是链接实现的功能.