我需要删除文件和应用程序中的其他一些进程阻止它。作为一种解决方法,我决定间隔几次尝试。这是正确的方法:
Observable.Start(() => File.Delete(path)).Retry(2)
.Delay(TimeSpan.FromMilliseconds(500)).Wait();
答案 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
,并根据重试次数动态计算延迟时间,这是链接实现的作用。