gpt4 book ai didi

c# - 根据重试次数调整超时时间

转载 作者:太空宇宙 更新时间:2023-11-03 22:47:01 25 4
gpt4 key购买 nike

我想使用 Polly 执行以下操作:尝试一个超时时间很短的请求。如果失败,请使用更长的超时时间重试。

我看到 Retry 可以像这样访问 retryCount:

Policy
.Handle<SomeExceptionType>()
.Retry(3, (exception, retryCount, context) =>
{
// do something
});

而且我看到 Timeout 可以指定 intTimeSpan,如下所示:

Policy.Timeout(TimeSpan.FromMilliseconds(2500))

我什至看到您可以将函数传递给超时,如下所示:

Policy.Timeout(() => myTimeoutProvider)) // Func<TimeSpan> myTimeoutProvider

Func 选项似乎是最有前途的,但它在哪里可以访问重试计数?将状态保持在策略之外很诱人,但如果我想以线程安全的方式共享策略,那将很危险。

有什么建议吗?

最佳答案

您可以使用 Polly Context 在执行中涉及的不同策略之间传递状态数据。 Polly Context 的唯一实例随每次 Polly 执行而流动,因此这是完全线程安全的。

有关此技术的更多详细信息 in this blog post .

例如:

const string RetryCountKey = "RetryCount";

RetryPolicy retryStoringRetryCount = Policy
.Handle<Exception>()
.Retry(3, (exception, retryCount, context) =>
{
Console.WriteLine("Storing retry count of " + retryCount + " in execution context.");
context[RetryCountKey] = retryCount;
});

TimeoutPolicy timeoutBasedOnRetryCount = Policy
.Timeout(context =>
{
int tryCount;
try
{
tryCount = (int) context[RetryCountKey];
}
catch
{
tryCount = 0; // choose your own default for when it is not set; also applies to first try, before any retries
}

int timeoutMs = 25 * (tryCount + 1);
Console.WriteLine("Obtained retry count of " + tryCount + " from context, thus timeout is " + timeoutMs + " ms.");
return TimeSpan.FromMilliseconds(timeoutMs);
});

PolicyWrap policiesTogether = retryStoringRetryCount.Wrap(timeoutBasedOnRetryCount);

(注意:当然这个 ^ 可以做得更简洁。在这里列出是为了最大程度地清楚。)

这是一个live dotnetfiddle example .

关于c# - 根据重试次数调整超时时间,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/49344841/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com