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

时间:2014-04-11 10:31:01

标签: c# system.reactive

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

Observable.Start(() => File.Delete(path)).Retry(2)
    .Delay(TimeSpan.FromMilliseconds(500)).Wait();

1 个答案:

答案 0 :(得分:7)

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

  • 延迟并不会影响您的思考方式 - 它会延迟传递事件,但源仍会立即运行。
  • 您正在Retry
  • 之前发出Delay
  • 您需要使用Defer来创建工厂,因为Start只会在评估时调用嵌入式函数一次。

请查看此答案,了解有关Delay的更多详细信息以及DelaySubscription更好的原因:Rx back off and retry

这个答案很好地实现了后退重试:Write an Rx "RetryAfter" extension method

您的代码的一个简单修复可能就是这样,它会捕获异常并在延迟后重新生成它 - 但如果它有效则没有延迟:

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

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

我保持上面的代码简单明了,并不是完美的 - 例如,它总是延迟异常。

你真的希望在行动中拥有DelaySubscription,并根据重试次数动态计算延迟时间,这是链接实现的作用。