什么 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 重载的签名来解决这个问题。
我正在尝试实施一个重试策略,该策略将在抛出异常时重试。
不幸的是,我似乎无法正确获取 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 重载的签名来解决这个问题。