什么 return 作为 onRetryAsync?

What to return as onRetryAsync?

我正在尝试实施一个重试策略,该策略将在抛出异常时重试。

不幸的是,我似乎无法正确获取 onRetryAsync 块的签名。编译器说 "Not all code paths return a value in lambda expression of type...."

The documentation suggests to return Task.CompletedTask 但这在我被迫使用的当前库中显然不可用。

var retryPolicy = Policy
                    .Handle<SigsThrottledException>(e => e.RetryAfterInSeconds > 0)
                    .WaitAndRetryAsync(
                        retryCount: 3,
                        sleepDurationProvider: (i, e, ctx) =>
                        {
                            var ste = (SigsThrottledException)e;
                            return TimeSpan.FromSeconds((double)ste.RetryAfterInSeconds);
                        },
                        onRetryAsync: (e, ts, i, ctx) =>
                        {
                            // Logging goes here
                        });

<....>

var response = await retryPolicy.Execute(async () =>
        {
            Uri substrateurl = new Uri("https://substrate.office.com/");
            return await SIGSClient.Instance.PostAsync(client, substrateurl, new UserInfo(), "faketoken", new Signal(), Guid.NewGuid()).ConfigureAwait(false);
        }
        );

所以:这是编译器没有帮助的情况,加上 async/await 等对我来说仍然相当新,而且并不总是那么容易弄清楚。

基本上我遗漏了一件事:

onRetryAsync: async (e, ts, i, ctx) =>

...签名前面的异步,顺便说一句,我链接到的代码示例中没有出现。

onRetryAsync 参数的类型是Func<Exception, TimeSpan, int, Context, Task>,可以这样声明:

Func<Exception, TimeSpan, int, Context, Task> nopBlock = async (e, ts, i, ctx) =>
        {
            // Do something here
            // The "something" should be async
        };

我最终通过查找我正在调用的 WaitAndRetryAsync 重载的签名来解决这个问题。