Ale*_*hov 1 c# system.reactive
我需要删除一个文件和应用程序中的其他一些进程阻止它.作为一种解决方法,我决定间隔几次尝试.这是正确的方法:
Observable.Start(() => File.Delete(path)).Retry(2)
.Delay(TimeSpan.FromMilliseconds(500)).Wait();
Run Code Online (Sandbox Code Playgroud)
这不会按照你想要的方式工作.有三个问题:
Retry之前的DelayDefer创建工厂,因为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动作,并根据重试次数动态计算延迟时间,这是链接实现的功能.