我正在尝试在 C#中使用Polly包。我想运行一些代码,然后,如果失败,请等待并重试。目前我的循环看起来与此类似:
var successful = false
while (!successful){
// Try to perform operation.
successful = TryToDoStuff()
if (!successful){
// Wait, then retry.
await Task.WhenAny(
taskCompletionSource1.Task,
taskCompletionSource1.Task,
Task.Delay(TimeSpan.FromSeconds(10)));
}
}
即:等待 10 秒或直到这些任务完成源之一收到信号并终止。然后重试。
我想做的是这样的(Polly API 不支持):
Policy
.Handle<RetryException>()
.WaitAndRetryForever(
Task.WhenAny(
taskCompletionSource1.Task,
taskCompletionSource1.Task,
Task.Delay(TimeSpan.FromSeconds(10))))
.Execute(TryToDoStuff); // Method TryToDoStuff will throw RetryException if it fails
有可能用波莉做这样的事情吗?我可以等待 TimeSpan 以外的任何东西吗?
关于我在上面的例子中等待的两个任务:一个任务是取消,表明整个事情应该关闭。另一个是“唤醒连接尝试”任务,其终止指示“此对象的状态已更改;尝试再次调用它”。在这两种情况下,我都希望我的循环立即继续下一次迭代,而不是等待超时过去。
目前等待超时并不是那么糟糕,因为它只有 10 秒,但如果我将其更改为指数退避,那么突然超时可能会很长。因此,我希望中断超时并直接进行下一次迭代。
注意:我的重试循环不一定要遵循异步等待模式。如果等待部分是同步和阻塞的就可以了。我只想能够使用任务完成源取消等待。